이전 테스트
이전 시간에 다음과 같은 테스트를 작성했다. setUp에서 Mockito.mock 메서드를 사용해 loginRepository를 Mock 객체로 초기화 시켰는데, 여기서는 LoginUseCase에 대한 의존성이 하나만 있어서 한 줄로 Mocking이 끝났다.
class LoginUseCaseTest {
private lateinit var loginUseCase: LoginUseCase
private lateinit var loginRepository: LoginRepository
@Before
fun setUp() {
loginRepository = Mockito.mock(LoginRepository::class.java)
loginUseCase = LoginUseCase(loginRepository)
}
@Test
fun testLoginSuccessStub() {
val repositorySuccessResult = LoginRepositoryResult.Success("test_token")
Mockito.`when`(loginRepository.login(userName = "test", password = "test"))
.thenReturn(repositorySuccessResult)
val result = loginUseCase.logIn(userName = "test", password = "test")
assertEquals(LoginUseCaseResult.Success("test_token"), result)
}
}
하지만 만약 10개 이상의 Mock객체가 있다면 어떻게 해야 할까? setUp메서드가 매우 복잡해질 것이다. 이를 해결하기 위한 방법이 있다.
바로 Annotation 기반으로 테스트를 작성할 수 있도록 도와주는 MockitoJUnitRunner 를 사용하는 것이다.
MockitoJUnitRunner 사용해 코드 깔끔하게 만들기
MockitoJUnitRunner를 사용하기 위해서는 클래스 위에 다음과 같이 선언하면 된다.
@RunWith(MockitoJUnitRunner::class)
class LoginUseCaseTest {
그러면 이제 loginRepository에 @Mock을 붙이면 @Before에 Mockito.mock을 수행하는 것과 같은 효과를 만든다.
@Mock
private lateinit var loginRepository: LoginRepository
따라서 전체 코드는 다음과 같이 바뀐다. setUp에서 Mockito.mock 메서드가 사라진 것을 확인할 수 있다.
@RunWith(MockitoJUnitRunner::class)
class LoginUseCaseTest {
private lateinit var loginUseCase: LoginUseCase
@Mock
private lateinit var loginRepository: LoginRepository
@Before
fun setUp() {
loginUseCase = LoginUseCase(loginRepository)
}
@Test
fun testLoginSuccessStub() {
val repositorySuccessResult = LoginRepositoryResult.Success("test_token")
Mockito.`when`(loginRepository.login(userName = "test", password = "test"))
.thenReturn(repositorySuccessResult)
val result = loginUseCase.logIn(userName = "test", password = "test")
Assert.assertEquals(LoginUseCaseResult.Success("test_token"), result)
}
}
개인적인 의견
개인적으로 Annotation을 사용하는 것은 코드를 읽는 사람에게 요구하는 지식을 증가시키기 때문에 좋아하지 않는다. 하지만, Mockito 정도의 프레임웍이면 Kotlin, Java 기반 프로젝트에서 테스트를 작성할 때 많이 사용되기 때문에 이정도 Annotation은 가독성을 떨어트리지 않아 괜찮다고 생각한다. 너무 Annotation을 남발하는 것만 주의하도록 하자.
반응형