Java로 프로그래밍할 때 피해야 할 9가지 실수
Java로 프로그래밍할 때 어떤 실수를 피해야 할까요? 다음 글에서 이 질문에 대한 답을 찾아보세요.
수석 Java 개발자가 모든 마법을 보여주는 Java 관련 문서에서 컨테이너 양식 테스트를 실행하는 방법을 알아보세요.
사용 스프링 부팅 에서 프로젝트 를 사용하여 상용구를 줄입니다. 테스트 컨테이너는 다음과 독립적입니다. 스프링 프레임워크 없이도 사용할 수 있습니다.
테스트 컨테이너 버전 1.17.3을 사용하고 있지만 최신 버전을 자유롭게 사용하세요. Postgres 컨테이너로 테스트합니다.
먼저 컨테이너를 정의합니다:
public class Postgres13TC extends PostgreSQLContainer {
비공개 정적 최종 Postgres13TC TC = new Postgres13TC();
private Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
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() {
// 아무것도 하지 않습니다. 이것은 공유 인스턴스입니다. 이 작업을 JVM이 처리하도록 합니다.
}
}
그런 다음 Spring 애플리케이션 컨텍스트를 초기화합니다. 컨테이너 인스턴스에서 모든 데이터 소스 구성을 가져와서 Spring 구성으로 설정합니다:
public class ContainerInit 구현하는 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()
);
}
}
마지막으로 테스트를 실행하면 모든 것이 내부에서 시작됩니다:
스프링부트테스트(웹환경 = RANDOM_PORT)
자동 구성 테스트 데이터베이스(대체 = NONE)
컨텍스트 구성(초기화자 = ContainerInit.class)
테스트 컨테이너
클래스 더미 리포지토리 테스트 {
@Autowired
비공개 DummyRepository dummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
또는 Spring 독립 테스트를 실행하려면 컨테이너를 직접 사용할 수 있습니다:
테스트 컨테이너
SimpleDbTest 클래스 {
@Container
비공개 정적 최종 Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Test
void testConnection() {
assumeThat(postgres13TC.isRunning());
var connectionProps = 새로운 속성();
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();
}
}
}
테스트컨테이너는 사용하기 매우 쉬운 도구로, Docker 컨테이너를 사용하는 통합 테스트를 생성하는 데 도움이 됩니다. 이를 통해 유연성이 향상되고 개발 속도가 빨라집니다. 테스트 구성을 올바르게 설정하면 새로운 개발자를 합류시키는 데 필요한 시간이 단축됩니다. 모든 종속성을 설정할 필요 없이 선택한 구성 파일로 작성된 테스트를 실행하기만 하면 됩니다.