9 fejl, du skal undgå, når du programmerer i Java
Hvilke fejl bør man undgå, når man programmerer i Java? I det følgende afsnit besvarer vi dette spørgsmål.
Lær, hvordan du kører containertest i vores Java-relaterede artikel, hvor vores senior java-udvikler viser al magien.
Jeg bruger Spring Boot i projekt for at reducere standardtekster. Testcontainere er uafhængige af Spring Framework og du kan bruge dem uden.
Jeg bruger Testcontainers version 1.17.3, men du er velkommen til at bruge den nyeste. Test med Postgres-container.
Definér først containeren:
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() {
// gør ingenting. Dette er en delt instans. Lad JVM håndtere denne operation.
}
}
Initialiser derefter Spring-applikationskonteksten. Vi henter alle datakildekonfigurationer fra containerinstansen og indstiller dem som Spring-konfigurationer:
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()
);
}
}
Til sidst kan vi køre vores test, og alt vil blive startet under motorhjelmen:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testcontainere
klasse DummyRepositoryTest {
@Autowired
privat DummyRepository dummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Eller hvis vi vil køre en Spring-uafhængig test, kan vi bruge containeren direkte:
@Testcontainere
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 er meget brugervenlige værktøjer, som hjælper os med at skabe integrationstest, der bruger Docker-containere. Det giver os mere fleksibilitet og øger udviklingshastigheden. Korrekt opsætning af testkonfiguration reducerer den tid, det tager at sætte nye udviklere i gang. De behøver ikke at opsætte alle afhængigheder, de skal bare køre de skrevne tests med udvalgte konfigurationsfiler.