본문 바로가기

Backend/SpringBoot

[SpringBoot]JUnit5 Mock기반 테스트

테스트  예시

Mock 객체 생성

public class ExampleTest {
	private ExampleService exampleService;
	private ExampleRepository mockExampleRepository;

	@SetUp
	public void setUp() {
		mockExampleRepository = Mockito.mock(ExampleRepository.class);
		exampleService = new ExampleService(mockExampleRepository);
	}
}

Annotation기반 예시

import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.InjectMocks;
import org.mockito.Mock;

@ExtendWith(MockitoExtension.class)
public class ExampleTest {
	@InjectMocks
	private ExampleService exampleService;
	@Mock
	private ExampleRepository mockExampleRepository;
}

Annotation 기반 예시

import org.mockito.InjectMocks;
import org.mockito.Mock;

public class ExampleTest {
	@InjectMocks
	private ExampleService exampleService;
	@Mock
	private ExampleRepository mockExampleRepository;

	@SetUp
	public void setUp() {
		MockitoAnnotations.openMocks(this);
	}
}

Mock 객체 given 설정 예시

특정 값이 입력했을 때 도메인 로직이 어떻게 동작할지 핸들링할 수 있습니다.

/*mock 객체의 특정 메서드에 특정 값을 전달했을 때 특정 결과를 반환하도록 유도하는 방법.*/
BDDMockito.given(mockExampleRepository.findOne(any()))
	.willReturn(Optional.empty());
/*특정 메서드에서 특정 값을 전달했을 때 특정 예외처리가 반환되도록 유도하는 방법. new 키워드 사용가능*/
BDDMockito.given(mockExampleRepository.findOne(isA(String.class)))
	.willThrow(Exception.class);

Mcok 객체 then 예시

ExampleResponse result = exampleService.example("AA");
// then
/*원하는 결과인지 테스트*/
Assertions.assertThat(result.getMsg()).isEqualsTo("성공");

/*mock객체에 원하는 값을 전달했는지 테스트*/
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(mockExampleRepository, Mockito.times(n)).findOne(argumentCaptor.capture());
Assertions.assertThat(argumentCaptor.getValue()).isEqualsTo("AA");

/*mock객체의 findOne 메서드에 String 타입의 값을 전달했는지 검사.*/
Mockito.verify(mockExampleRepository).findOne(isA(String.class));

/*mock객체의 findOne 메서드가 최소 n번 호출했는지 검사.*/
Mockito.verify(mockExampleRepository, Mockito.times(n)).findOne(any());