나는 온라인에서 테스트에 관련된 다양한 튜토리얼을보고 Spring Boot
하고, 테스트가 언급 된 방법에 의해 혼동되었다.
일부 기사를 사용하는 것이 컨트롤러 테스트를 참조 @WebMvcTest
로 주석 Unit Test
일부 반면이로 참조 Integration Test
. 하나가 올바른지 확실하지 않습니다.
같은 질문에 저장소 계층 테스트에 적용됩니다 @DataJpaTest
.
내 응용 프로그램 작성이 개 테스트 컨트롤러에 대한 하나는 저장소에 대한 또 다른 하나를 다음했다.
바닥에 나는 모두에 대한 몇 가지 질문이 있습니다. 안내하시기 바랍니다.
UserControllerTest.java
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserRepository userRepository;
@Test
public void signUp() throws Exception {
this.mockMvc.perform(get("/signup")).andExpect(status().isOk());
}
}
UserRepositoryTest.java
@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
@Test
public void whenFindByName_thenReturnEmployee() {
// given
User u = new User();
u.setName("ab");
u.setEmail("[email protected]");
entityManager.persistAndFlush(u);
// when
Optional<User> user = userRepository.findById(1L);
// then
assertTrue(user.isPresent());
}
}
내 질문이 있습니다 :
- 주석을 하는가
@WebMvcTest, @DataJpaTest
또는@SpringBootTest
시험의 유형을 결정 (Unit
또는Integration
) 또는 그것의 사용이다@MockBean
를 결정하는 시험에서? - 그 가정하면
UserControllerTest.java
우리가 조롱하는 단위 테스트입니다userRepository
여기 의존성@MockBean private UserRepository userRepository
에 반면에UserRepositoryTest.java
우리가 그것을 autowiring에 있습니다@Autowired private UserRepository userRepository
. 왜 ??
봄 부팅을 사용하여 단위 테스트 및 통합 테스트의 주요 차이점은, 통합 테스트가 실행이 시작되기 전에 Spring 컨텍스트를 부트 스트랩 반면 단위 테스트를 분리하여 실행할 수 있다는 것입니다.
단독으로 실행하면 테스트중인 컨트롤러를 기반으로 종속성을 조롱해야합니다. 이렇게하면 자신이 데이터베이스 또는 서비스의 오버 헤드에 대해 걱정할 필요없이 매우 구체적인 테스트 케이스는 엔드 - 투 - 엔드 테스트 할 수 있습니다. 따라서, 주석 @MockBean를 사용하여.
반면, 통합 테스트는 데이터베이스와 응용 프로그램의 다른 레이어를 통합에 초점을 맞추고 있습니다. 대부분의 사람들은 자신의 저장소를 테스트하는 등의 H2와 같은에서 메모리 데이터베이스를 활용합니다. 통합 테스트는 조롱을 포함 할 수 없습니다 및 테스트의 두 가지 유형 별도로 실행해야합니다.