9 zu vermeidende Fehler bei der Programmierung in Java
Welche Fehler sollten bei der Programmierung in Java vermieden werden? Im folgenden Beitrag beantworten wir diese Frage.
Erfahren Sie in unserem Java-Artikel, in dem unser erfahrener Java-Entwickler die ganze Magie zeigt, wie man Container-Form-Tests ausführt.
Ich benutze Spring Boot im Projekt zur Reduzierung von Standardtexten. Testcontainer sind unabhängig von Spring Framework und Sie können sie auch ohne diese verwenden.
Ich verwende Testcontainers Version 1.17.3, aber Sie können auch die neueste Version verwenden. Tests mit Postgres-Container.
Definieren Sie zunächst den Container:
public class Postgres13TC extends PostgreSQLContainer {
private static final Postgres13TC TC = new Postgres13TC();
private Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
return TC;
}
@Override
public void start() {
super.start();
System.setProperty("DB_URL", TC.getJdbcUrl());
System.setProperty("DB_USERNAME", TC.getUsername());
System.setProperty("DB_PASSWORD", TC.getPassword());
}
@Override
public void stop() {
// nichts tun. Dies ist eine gemeinsam genutzte Instanz. Lassen Sie die JVM diese Operation durchführen.
}
}
Dann initialisieren Sie den Spring-Anwendungskontext. Wir holen alle Datenquellenkonfigurationen aus der Container-Instanz und setzen sie als Spring-Konfiguration:
public class ContainerInit implements ApplicationContextInitializer {
public static Postgres13TC postgres13TC;
static {
postgres13TC = Postgres13TC.getInstance();
postgres13TC.start();
}
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
applicationContext,
"spring.datasource.url=" + postgres13TC.getJdbcUrl(),
"spring.datasource.username=" + postgres13TC.getUsername(),
"spring.datasource.password=" + postgres13TC.getPassword(),
"db.host=" + postgres13TC.getHost(),
"db.port=" + postgres13TC.getMappedPort(postgres13TC.POSTGRESQL_PORT),
"db.name=" + postgres13TC.getDatabaseName(),
"db.username=" + postgres13TC.getUsername(),
"db.passwort=" + postgres13TC.getPasswort()
);
}
}
Schließlich können wir unseren Test ausführen, und alles wird unter der Haube gestartet:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@KontextKonfiguration(initializers = ContainerInit.class)
@Testcontainer
Klasse DummyRepositoryTest {
@Autowired
private DummyRepository dummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Wenn wir einen von Spring unabhängigen Test durchführen wollen, können wir auch direkt Container verwenden:
@Testcontainer
Klasse SimpleDbTest {
@Container
private static final Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Test
void testConnection() {
assumeThat(postgres13TC.isRunning());
var connectionProps = new Properties();
connectionProps.put("user", postgres13TC.getUsername());
connectionProps.put("passwort", postgres13TC.getPassword());
try (Verbindung connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),
connectionProps)) {
var resultSet = connection.prepareStatement("Select 1").executeQuery();
resultSet.next();
assertThat(resultSet.getInt(1)).isEqualTo(1);
} catch (SQLException sqlException) {
assertThat((Exception) sqlException).doesNotThrowAnyException();
}
}
}
Testcontainer sind sehr einfach zu bedienende Tools, die uns helfen, Integrationstests zu erstellen, die Docker-Container verwenden. Das gibt uns mehr Flexibilität und erhöht die Entwicklungsgeschwindigkeit. Die ordnungsgemäße Einrichtung der Testkonfiguration verringert den Zeitaufwand für die Einarbeitung neuer Entwickler. Sie müssen nicht alle Abhängigkeiten einrichten, sondern nur die geschriebenen Tests mit ausgewählten Konfigurationsdateien ausführen.