- 테스트 클래스가 Mockito를 사용한다는 의미이다.
- 실제 객체 대신 가짜 객체로 선언한다는 의미이다. (빈 껍데기 상태)
- 가짜 객체를 Spring의 Bean으로 등록한다는 의미이다.
- 스프링 컨테이너를 띄워서 테스트하는 경우 테스트할 대상이 Bean에 의존성을 가지고 있을 때 사용한다.
- @Mock, @Spy으로 선언한 객체를 주입 받을 클래스를 의미한다.
- 주로 테스트할 클래스를 필드선언할 때 사용된다.
- Test Code 에서 실제 객체처럼 사용한다는 의미이다.
- Test Code에서 실제 객체처럼 사용할 객체를 Spring의 Bean으로 등록한다는 의미이다.
- SpyBean은 실제 구현된 객체를 감싸는 프록시 객체 형태이므로, 스프링 컨테이너에 실제 구현체가 등록되어 있어야 한다.
pom.xml(Maven)
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.6.1</version>
<scope>test</scope>
</dependency>
build.gradle(Gradle)
testImplementation group: 'org.mockito', name: 'mockito-core', version: '4.6.1'
testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '4.6.1'
@ExtendWith(MockitoExtension.class), @Mock, @InjectMocks
@ExtendWith(MockitoExtension.class) //Mockito 사용 선언
public class TestServiceTest {
@InjectMocks //객체 주입받을 테스트할 클래스
private MemberService memberService;
@Mock //가짜 객체 생성
private MemberRepository memberRepository;
@DisplayName("Member 객체 조회 서비스 테스트")
@Test
void getMemberTest() {
//given
//테스트에 사용할 객체 생성
Member member = Member.builder()
.memberId(1)
.memberUsername("test")
.memberPassword("test111")
.build();
//Mock 객체 행위 정의
when(memberRepository.findById(member.getMemberId())).thenReturn(member);
//when
//memberService가 행동 했을 때
Member searchedMember = memberService.getMember(member.getMemberId());
//then
//검증 단계
verify(memberRepository).findById(member.getMemberId());
assertEquals(searchedMember, member);
}
}
@DisplayName : Test에 대한 설명
- member라는 객체 생성, memberRepository.findById(member.getMemberId()) 메소드가 실행되면 member 객체를 리턴한다.
- memberService.getMember(member.getMemberId())가 사용되면 searchedMember로 정의한다.
- verify : memberRepository.findById(member.getMemberId()) 가 한 번 잘 실행되었는지 검증한다.
- assertEquals : searchedMember, member 두 객체가 같은지 확인한다.
@MockBean
@WebMvcTest(MemberController.class)
- 웹 어플리케이션을 서버에 올리지 않고 MVC 환경을 만들어 요청, 전송 및 응답을 테스트하게 도와주는 Annotation이다.
- Controller를 테스트할 때 사용된다.
@WebMvcTest(MemberController.class) //MemberController 테스트 선언
public class MemberControllerTest {
@MockBean //가짜 객체 Bean 등록
private MemberService memberService;
@Autowired // mockMvc 객체를 주입 받음
private MockMvc mockMvc;
@DisplayName("Member 객체 조회 컨트롤러 테스트")
@Test
void getMemberTest() throws Exception {
//given
//테스트에 사용할 객체 생성
Member searchedMember = Member.builder()
.memberId(1)
.memberUsername("test")
.memberPassword("test111")
.build();
//MockBean 객체 행위 정의
when(memberService.getMember(member.getMemberId())).thenReturn(searchedMember);
//when
//클라이언트로부터 요청이 왔을 때
mockMvc.perform(get("/members/"+member.getMemberId()))
//then
.andExpect(status().isOk()) //200 상태 코드인지
.andExpect(model().attribute("member", searchedmember))
//model에 값들이 잘 담겼는지
.andExpect(view().name("member")); //view 생성이 잘되었는지
.andDO(print()) //요청 응답 정보 콘솔에 출력
}
}
- 테스트에서 사용할 searchedMember 객체 생성
- memberService.getMember(member.getMemberId()) 호출될 때 searchedMember 한다.
- mockMvc.perform(get(“/members/{memberId}”))로 get 요청이 들어온 상황을 구현한다.
- MockHttpServletRequestBuilder를 이용해 상황에 맞게 구현할 수 있다.
- andExpect로 기대되는 응답을 검증한다.
- MockMvcResultMatcher를 이용해 더 많은 정보를 검증할 수 있다.
Reference: