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 sont des outils très faciles à utiliser qui nous aident à créer des tests d'intégration qui utilisent des conteneurs Docker. Cela nous donne plus de flexibilité et augmente la vitesse de développement. La mise en place correcte de la configuration des tests réduit le temps nécessaire à l'intégration des nouveaux développeurs. Ils n'ont pas besoin de configurer toutes les dépendances, il suffit d'exécuter les tests écrits avec les fichiers de configuration sélectionnés.