9 errores que hay que evitar al programar en Java
¿Qué errores deben evitarse al programar en Java? En el siguiente artículo responderemos a esta pregunta.
Aprenda a ejecutar pruebas de formularios de contenedores en nuestro artículo relacionado con Java, donde nuestro desarrollador java senior muestra toda la magia.
Utilizo Spring Boot en el proyecto para reducir la burocracia. Los contenedores de prueba son independientes de Marco de trabajo de Spring y puedes usarlos sin eso.
Yo uso la versión 1.17.3 de Testcontainers, pero siéntete libre de usar la más reciente. Pruebas con contenedor Postgres.
Primero define contenedor:
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() {
// no hace nada. Esta es una instancia compartida. Deja que la JVM se encargue de esta operación.
}
}
A continuación inicializamos el contexto de la aplicación Spring. Obtenemos toda la configuración de la fuente de datos de la instancia del contenedor y la establecemos como configuración de Spring:
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.password=" + postgres13TC.getPassword()
);
}
}
Por último, podemos ejecutar nuestra prueba, y todo se iniciará bajo el capó:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(inicializadores = ContainerInit.class)
@ContenedoresDePrueba
clase DummyRepositoryTest {
@Autoconectado
privado DummyRepository dummyRepository;
@Prueba
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
O si queremos ejecutar pruebas independientes de Spring, podemos utilizar directamente el contenedor:
@Contenedoresdepruebas
clase SimpleDbTest {
@Contenedor
private static final Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Prueba
void testConnection() {
assumeThat(postgres13TC.isRunning());
var connectionProps = new Properties();
connectionProps.put("usuario", postgres13TC.getUsername());
connectionProps.put("contraseña", 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 son herramientas muy fáciles de usar que nos ayudan a crear pruebas de integración que utilizan contenedores Docker. Eso nos da más flexibilidad y aumenta la velocidad de desarrollo. Una configuración adecuada de las pruebas reduce el tiempo necesario para embarcar a los nuevos desarrolladores. No necesitan configurar todas las dependencias, sólo ejecutar las pruebas escritas con los archivos de configuración seleccionados.