상태 검증 : 메소드가 수행된 후, 객체의 상태를 확인하여 올바르게 동작했는지를 확인하는 검증법입니다
행위 검증 : 메소드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는지확인하는 검증법입니다
Spring의 JUnit 5 지원
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html
단위 테스트 지원
통합 테스트 지원
Spring TestContext 프레임워크
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testcontext-framework
주의해야 할 점은 AssertThat은 (실제값, 기대값) 순서이다.
1. prices의 사이즈가 3인가
2. prices안에 모든 값이 1보다 큰가
3. 순서 상관 없이 3,4,2가 포함되어있는가
4. prices는 2를 가지고 있는가
이거의 의미가 뭘까? 클래스 단위로 인스턴스를 만든다는 것!!
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ActiveProfiles("test")
class JdbcProductRepositoryTest {
static EmbeddedMysql embeddedMysql;
@BeforeAll
static void setup() {
var config = aMysqldConfig(v5_7_10)
.withCharset(Charset.UTF8)
.withPort(2215)
.withUser("test", "test1234!")
.withTimeZone("Asia/Seoul")
.build();
embeddedMysql = anEmbeddedMysql(config)
.addSchema("test-order_mgmt", ScriptResolver.classPathScript("schema.sql"))
.start();
}
@AfterAll
static void cleanup() {
embeddedMysql.stop();
}
@Autowired
ProductRepository repository;
private final Product newProduct = new Product(UUID.randomUUID(), "new-product", Category.COFFEE_BEAN_PACKAGE, 1000L);
@Test
@Order(1)
@DisplayName("상품을 추가할 수 있다.")
void testInsert() {
repository.insert(newProduct);
var all = repository.findAll();
assertThat(all.isEmpty(), is(false));
}
@Test
@Order(2)
@DisplayName("상품을 이름으로 조회할 수 있다.")
void testFindByName() {
var product = repository.findByName(newProduct.getProductName());
assertThat(product.isEmpty(), is(false));
}
@Test
@Order(3)
@DisplayName("상품을아이디로 조회할 수 있다.")
void testFindById() {
var product = repository.findById(newProduct.getProductId());
assertThat(product.isEmpty(), is(false));
}
@Test
@Order(4)
@DisplayName("상품들을 카테고리로 조회할 수 있다.")
void testFindByCategory() {
var product = repository.findByCategory(Category.COFFEE_BEAN_PACKAGE);
assertThat(product.isEmpty(), is(false));
}
}
상품을 아이디로 조회할 수 있다의 테스트는 실패한다.
왜일까?
그것은 바로 메서드 마다 하기 때문이다.
new Product(UUID.randomUUID(),
"new-product", Category.COFFEE_BEAN_PACKAGE, 1000L);
해결
(1) static으로 인스턴스 만들기
private static final Product newProduct = new
Product(UUID.randomUUID(), "new-product",
Category.COFFEE_BEAN_PACKAGE, 1000L);
(2) @TestInstance(TestInstance.Lifecycle.PER_CLASS)