9 fouten die je moet vermijden bij het programmeren in Java
Welke fouten moet je vermijden bij het programmeren in Java? In het volgende stuk beantwoorden we deze vraag.
Leer hoe je formuliertesten voor containers uitvoert in ons Java-gerelateerde artikel waarin onze senior Java-ontwikkelaar alle magie laat zien.
Ik gebruik Spring Boot in de project om boilerplate te verminderen. Testcontainers zijn onafhankelijk van Veerraamwerk en je kunt ze ook zonder dat gebruiken.
Ik gebruik Testcontainers versie 1.17.3, maar voel je vrij om de nieuwste te gebruiken. Tests met Postgres container.
Definieer eerst de container:
public class Postgres13TC extends PostgreSQLContainer {
private static final Postgres13TC TC = nieuwe Postgres13TC();
private Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
TC terug;
}
@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
openbare void stop() {
// niets doen. Dit is een gedeelde instantie. Laat JVM deze operatie afhandelen.
}
}
Dan initialiseren we Spring-toepassingscontext. We halen alle gegevensbronconfiguraties op uit de containerinstantie en stellen ze in als Spring-configuratie:
public class ContainerInit implementeert ApplicationContextInitializer {
public statische 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.password=" + postgres13TC.getPassword()
);
}
}
Tot slot kunnen we onze test uitvoeren en wordt alles onder de motorkap gestart:
@SpringBootTest(webomgeving = RANDOM_PORT)
@AutoConfigureTestDatabase(vervangen = GEEN)
@ContextConfiguratie(initializers = ContainerInit.class)
@Testcontainers
klasse DummyRepositoryTest {
@Autowired
private DummyRepository dummyRepository;
@Test
id shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = nieuwe Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Of als we een Spring onafhankelijke test willen uitvoeren, kunnen we de container direct gebruiken:
@Testcontainers
klasse SimpleDbTest {
@Container
private static final Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Test
id testConnection() {
assumeThat(postgres13TC.isRunning());
var connectionProps = nieuwe Properties();
connectionProps.put("user", postgres13TC.getUsername());
connectionProps.put("wachtwoord", postgres13TC.getPassword());
try (Connection connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),
connectionProps)) {
var resultSet = connection.prepareStatement("Select 1").executeQuery();
resultSet.next();
assertThat(resultSet.getInt(1)).isEqualTo(1);
} vang (SQLException sqlException) {
assertThat((Exception) sqlException).doesNotThrowAnyException();
}
}
}
Testcontainers zijn zeer eenvoudig te gebruiken tools die ons helpen om integratietests te maken die Docker-containers gebruiken. Dat geeft ons meer flexibiliteit en verhoogt de ontwikkelingssnelheid. Door de testconfiguratie goed in te stellen, hebben nieuwe ontwikkelaars minder tijd nodig. Ze hoeven niet alle afhankelijkheden in te stellen, maar alleen de geschreven tests uit te voeren met geselecteerde configuratiebestanden.