9 virhettä, joita kannattaa välttää Java-ohjelmoinnissa
Mitä virheitä tulisi välttää Java-ohjelmoinnissa? Seuraavassa kappaleessa vastaamme tähän kysymykseen.
Opi, miten konttien lomaketestit ajetaan Javaan liittyvässä artikkelissamme, jossa vanhempi java-kehittäjämme näyttää kaiken taikuuden.
Käytän Spring Boot vuonna projekti vähentääkseen paisuttelukirjoittelua. Testisäiliöt ovat riippumattomia Spring Framework ja voit käyttää niitä ilman sitä.
Käytän Testcontainersin versiota 1.17.3, mutta voit vapaasti käyttää uusinta versiota. Testit Postgres-säiliön kanssa.
Määrittele ensin säiliö:
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() {
// ei tee mitään. Tämä on jaettu instanssi. Anna JVM:n hoitaa tämä toiminto.
}
}
Alusta sitten Spring-sovelluskonteksti. Haemme kaikki tietolähdekonfiguraatiot kontti-instanssista ja asetamme ne Spring-konfiguraatioiksi:
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()".
);
}
}
Lopuksi voimme suorittaa testimme, ja kaikki käynnistyy konepellin alla:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testikontit
class DummyRepositoryTest {
@Autowired
private DummyRepository dummyRepository;
@Test
void shouldReturnDummy() { void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Tai jos haluamme suorittaa Spring-riippumattoman testin, voimme käyttää säiliötä suoraan:
@Testikontit
class SimpleDbTest {
@Container
private static final Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Testi
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();
}
}
}
Testcontainerit ovat erittäin helppokäyttöisiä työkaluja, joiden avulla voimme luoda Docker-astioita käyttäviä integrointitestejä. Tämä antaa meille enemmän joustavuutta ja lisää kehitysnopeutta. Testikokoonpanon oikeaoppinen asettaminen vähentää uusien kehittäjien alustusaikaa. Heidän ei tarvitse määrittää kaikkia riippuvuuksia, vaan ajaa vain kirjoitetut testit valituilla konfiguraatiotiedostoilla.