web/Junit

Spring Junit5 test Mockito (백기선님 인프런 강의)

반응형

mockito는 실제 객체와 비슷하게 동작하도록 하여 검증할 수 있는 방법을 제공해주는 라이브러리 이다. 

spring-boot-starter-test 모듈에 기본적으로 포함되어 있으며, 이 모듈을 사용하지 않을 경우 mockito-core, mockito-junit-jupiter 모듈을 추가하면 된다.

 

Mock 객체 만들기

Mock 객체를 만들어서 테스트를 진행할 수 있다. Mock객체로 만들고 싶은 객체에 @Mock 어노테이션을 달기만 하면 되는데 이때 만들어진 Mock 객체는 Null이기 때문에 그렇게 하지 않기 위해서 @ExtendWith(MockitoExtension.class)를 추가한다.

@ExtendWith(MockitoExtension.class)
class MockWedulTest {

    @Mock
    WedulRepository wedulRepository;

    WedulService wedulService;

    @BeforeEach
    void setup() {
        this.wedulService = new WedulService(wedulRepository);
    }

    @Test
    @DisplayName("Mock test")
    void mock_test() {

    }

}

모든 Mock 객체의 반환 타입은 다음과 같다.

  • 객체는 Null
  • Option 타입은 Optional.empty 리턴
  • Primitive 타입은 기본 Primitive 값
  • 콜렉션은 비워있는 콜렉션
  • void 반환값의 메소드는 아무런 일이 발생되지 않는다.

 

Stubbing

 

Mock 객체에  원하는 동작을 미리 지정해주는 것을 stub라고 하는데 이를 한번 수행해보자.

여러가지 stub 있겠지만 대표적으로 when을 많이 사용한다.

@Test
@DisplayName("Mock test")
void mock_test() {
	Wedul wedul = new Wedul();

	when(wedulRepository.getWedul(anyLong())).thenReturn(wedul);
	assertThat(wedulService.getWedul(1L)).isEqualTo(wedul);
}

 

Stubbing 확인

Mock 객체의 특정 행위가 몇번 호출되었는지, 추가적으로 interaction이 발생되었는지 여부등도 확인이 가능하다.

@Test
@DisplayName("stubbing verify 테스트")
void verify_stub_test() {
	Wedul wedul = new Wedul();
    when(wedulRepository.getWedul(anyLong())).thenReturn(wedul);
    assertThat(wedulRepository.getWedul(1L)).isEqualTo(wedul);

	// 목 객체의 getWedul()이 한번 실행되었는지 검증
    verify(wedulRepository, times(1)).getWedul(1L);
    // 목 객체 validate()가 한번도 안 실행되었는지 검증
    verify(wedulRepository, never()).validate();
    // 해당 Mock이 더 이상 interactiondl 발생되지 않아야 한다.
    verifyNoMoreInteractions(wedulRepository);
}

 

BDD Mockito

BDD(Behaviour-Driven Development)는 행동 기반 테스트인데 Mockito에서 제공하는 기능들을 이용하면 Given / When / Then 순서대로 검증이 가능하다.

- when이라는 subbing 메서드와 동일한 역할을 하는 given은 BDD를 위해서 when 대신 Given으로 사용한다.

- then을 통해서 검증이 가능하다.

@Test
@DisplayName("BDD 테스트")
void bdd() {	
	// given
    Wedul wedul = new Wedul();
    given(wedulRepository.getWedul(1L)).willReturn(wedul);

	// when
    Wedul selectWedul = wedulService.getWedul(1L);

	// then
    assertThat(selectWedul).isEqualTo(wedul);
    then(wedulRepository).should(times(1)).getWedul(1L);
    then(wedulRepository).shouldHaveNoMoreInteractions();
}

 

출처 : https://www.inflearn.com/course/the-java-application-test/

Github : https://github.com/weduls/junit5

반응형