9 feil du bør unngå når du programmerer i Java
Hvilke feil bør man unngå når man programmerer i Java? I det følgende besvarer vi dette spørsmålet.
Lær hvordan du kjører containertester i vår Java-relaterte artikkel, der vår senior java-utvikler viser deg hvordan du gjør det.
Jeg bruker Spring Boot i prosjekt for å redusere antall standardtekster. Testcontainere er uavhengige av Spring Framework og du kan bruke dem uten det.
Jeg bruker Testcontainers versjon 1.17.3, men du kan gjerne bruke den nyeste. Tester med Postgres-container.
Definer først container:
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() {
// gjør ingenting. Dette er en delt instans. La JVM håndtere denne operasjonen.
}
}
Initialiser deretter Spring-applikasjonskonteksten. Vi henter all datakildekonfigurasjon fra containerinstansen og angir dem som Spring-konfigurasjon:
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 slutt kan vi kjøre testen vår, og alt vil bli startet under panseret:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initialisatorer = ContainerInit.class)
@Testcontainere
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);
}
}
Eller hvis vi ønsker å kjøre Spring-uavhengige tester, kan vi bruke 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 et svært brukervennlig verktøy som hjelper oss med å lage integrasjonstester som bruker Docker-containere. Det gir oss mer fleksibilitet og øker utviklingshastigheten. Riktig oppsett av testkonfigurasjon reduserer tiden det tar for nye utviklere å gå om bord. De trenger ikke å sette opp alle avhengigheter, men kan bare kjøre de skrevne testene med utvalgte konfigurasjonsfiler.