9 viga, mida vältida Java programmeerimisel
Milliseid vigu tuleks Java keeles programmeerimisel vältida? Järgnevas teoses vastame sellele küsimusele.

Õppige, kuidas käivitada konteinerite vormi teste meie Java-ga seotud artiklis, kus meie vanem Java-arendaja näitab kogu maagiat.
Ma kasutan Spring Boot aastal projekt et vähendada keedukirjeldusi. Testimismahutid on sõltumatud Spring Framework ja neid saab kasutada ka ilma selleta.
Ma kasutan Testcontainersi versiooni 1.17.3, kuid võite vabalt kasutada ka uuemat versiooni. Testid Postgres konteineriga.
Kõigepealt defineerige konteiner:
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 midagi. See on jagatud instants. Las JVM tegeleb selle toiminguga.
}
}
Seejärel initsialiseerige Springi rakenduse kontekst. Saame kõik andmeallikate konfiguratsioonid konteineri instantsist ja seame need Springi konfiguratsiooniks:
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()
);
}
}
Lõpuks saame käivitada oma testi ja kõik käivitub kapoti all:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testikonteinerid
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);
}
}
Või kui me tahame käivitada Springi sõltumatu testi, võime kasutada konteinerit otse:
@Testikonteinerid
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();
}
}
}
Testcontainerid on väga lihtsasti kasutatavad tööriistad, mis aitavad meil luua integratsiooniteste, mis kasutavad Dockeri konteinereid. See annab meile rohkem paindlikkust ja suurendab arenduskiirust. Testi konfiguratsiooni õige seadistamine vähendab uute arendajate pardaloleku aega. Nad ei pea seadistama kõiki sõltuvusi, vaid lihtsalt käivitama kirjutatud testid valitud konfiguratsioonifailidega.