import static org.junit.jupiter.api.Assertions.*
assertEquals(expected, actual)
두 값이 같은지
assertNotNull(actual, "message")
actual 해당 값이 null인지 아닌지, null일 경우 message 출력
assertThrows(Exception.class, () -> ~~ )
람다식에 해당하는 것이 앞의 Exception이 발생하는지 테스트
@BeforeEach
각 테스트가 실행되기 전 실행
@BeforeAll
테스트 케이스를 한번에 실행 시키면서 딱 한번만 초기화 작업을 할 수 잇게 만든다.
@AfterEach
각 테스트가 끝난 후 실행 (초기화 해줄 때 주로 씀)
각 계층에 구현해 놓은 기능들이 잘 동작하는지 특정 계층만 잘라서 테스트 하는 것을 슬라이스 테스트라고 한다.
//given
주어진 상황
//when
이러한 때에
//then
이 값이 나와야한다
@SpringBootTest
@AutoConfigureMockMvc
class MemberControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private Gson gson;
@Test
void postMemberTest() throws Exception {
// given
MemberDto.Post post = new MemberDto.Post("hgd@gmail.com",
"홍길동",
"010-1234-5678");
String content = gson.toJson(post);
// when
ResultActions actions =
mockMvc.perform(
post("/v11/members")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(content)
);
// then
MvcResult result = actions
.andExpect(status().isCreated())
.andReturn();
// System.out.println(result.getResponse().getContentAsString());
}
}
위와 같이 Test를 하게 된다.
Gson을 통해 MemberDto 데이터를 json 형태로 변환
-> mockMvc를 통해 Controller 핸들러 메서드에 요청 전송
-> andExpect 등을 통해 원하는 값이 나왔는지 검증
테스트 순서에 따라 다른 결과가 나올 수 있다. 따라서 각각의 테스트가 끝난 후 DB를 초기화 시켜주어야 한다.
이 때 쓸 수 있는 것이 @DataJpaTest 이다.
@ DataJpaTest
이는 @Transactional 애너테이션을 포함하고 있다. 따라서 하나의 테스트 케이스가 종료될 때 데이터베이스 안의 데이터는 rollback 처리가 된다.
여러 개의 테스트를 동시에 실행시켜도 된다.
Mockito는 Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 기능을 한다.
@MockBean 애너테이션은 Application Context에 등록되어있는 Bean에 대한 Mock 객체를 생성하고 주입해주는 역할을 한다.
Junit에서 Spring을 사용하지 않고 Mockito의 기능만 사용하려면
@ExtendWith(MockitoExtension.class)를 클래스 레벨에 추가한다
@Mock 애너테이션을 추가하면 해당 필드의 객체를 Mock 객체로 생성
위의 객체는 @InjectMocks 애너테이션을 추가한 필드에 주입된다.
Test Driven Development
테스트를 하나씩 만들어가며 그정도씩만 만들어나감