9 erreurs à éviter lors de la programmation en Java
Quelles sont les erreurs à éviter lors de la programmation en Java ? Dans l'article suivant, nous répondons à cette question.
Apprenez à exécuter des tests de formulaires de conteneurs dans notre article sur Java où notre développeur Java senior montre toute la magie.
J'utilise Spring Boot dans le projet afin de réduire le nombre de documents de base. Les conteneurs de test sont indépendants des Cadre de travail Spring et vous pouvez les utiliser sans cela.
J'utilise Testcontainers version 1.17.3, mais n'hésitez pas à utiliser la plus récente. Tests avec le conteneur Postgres.
Définir d'abord le conteneur :
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() {
// ne fait rien. Il s'agit d'une instance partagée. Laissez la JVM gérer cette opération.
}
}
Ensuite, nous initialisons le contexte d'application Spring. Nous récupérons toutes les configurations de sources de données de l'instance de conteneur et les définissons en tant que configuration Spring :
public class ContainerInit implements ApplicationContextInitializer {
public static Postgres13TC postgres13TC ;
statique {
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()
) ;
}
}
Enfin, nous pouvons exécuter notre test, et tout sera lancé sous le capot :
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testcontainers
class 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) ;
}
}
Ou si nous voulons exécuter des tests indépendants de Spring, nous pouvons utiliser directement le conteneur :
@Testcontainers
class 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("password", 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) ;
} catch (SQLException sqlException) {
assertThat((Exception) sqlException).doesNotThrowAnyException() ;
}
}
}
Testcontainers are very easy-to-use tools that help us to create integration tests that use Docker containers. That gives us more flexibility and increases development speed. Proper setup of test configuration reduces the time needed to board new developers. They don’t need to set up all dependencies, just run the written tests with selected configuration files.
