9 misstag att undvika när du programmerar i Java
Vilka misstag bör man undvika när man programmerar i Java? I följande stycke besvarar vi denna fråga.
Lär dig hur du kör containertester i vår Java-relaterade artikel där vår seniora java-utvecklare visar all magi.
Jag använder Spring Boot i projekt för att reducera boilerplate. Testbehållare är oberoende av Spring-ramverket och du kan använda dem utan det.
Jag använder Testcontainers version 1.17.3, men du får gärna använda den senaste. Testar med Postgres container.
Definiera först container:
offentlig klass Postgres13TC utökar PostgreSQLContainer {
privat statisk slutlig Postgres13TC TC = new Postgres13TC();
privat Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
return TC;
}
@Överstyrning
offentligt ogiltigt start() {
super.start();
System.setProperty("DB_URL", TC.getJdbcUrl());
System.setProperty("DB_USERNAME", TC.getUsername());
System.setProperty("DB_PASSWORD", TC.getPassword());
}
@Överträdelse
public void stop() {
// gör ingenting. Detta är en delad instans. Låt JVM hantera denna operation.
}
}
Initialisera sedan Spring-applikationskontexten. Vi hämtar all datakällkonfiguration från containerinstansen och ställer in dem som Spring-konfiguration:
public class ContainerInit implements ApplicationContextInitializer {
public static Postgres13TC postgres13TC;
static {
postgres13TC = Postgres13TC.getInstance();
postgres13TC.start();
}
@Overrid
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()
);
}
}
Slutligen kan vi köra vårt test, och allt kommer att startas under huven:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initialiserare = ContainerInit.class)
@Testcontainers
klass DummyRepositoryTest {
@Autowired
privat DummyRepository dummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = ny Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Eller om vi vill köra Spring Independent-test kan vi använda containern direkt:
@Testbehållare
klass 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 är ett mycket lättanvänt verktyg som hjälper oss att skapa integrationstester som använder Docker-containrar. Det ger oss mer flexibilitet och ökar utvecklingshastigheten. Korrekt inställning av testkonfigurationen minskar den tid som krävs för att introducera nya utvecklare. De behöver inte konfigurera alla beroenden, utan bara köra de skrivna testerna med utvalda konfigurationsfiler.