오버-모킹(Over-mocking)은 테스트에서 필요 이상으로 많은 객체나 메소드를 모킹하는 것을 의미합니다. 이로 인해 테스트의 가독성이 떨어지고, 필요한 부분만을 집중적으로 테스트하기 어렵게 됩니다. 오버-모킹의 주요 원인과 이를 피하는 방법에 대해 알아봅시다.
@Mock
과 @InjectMocks
어노테이션을 활용하여 테스트 대상 객체와 관련된 의존성만 모킹할 수 있습니다.@InjectMocks
private SomeService someService;
@Mock
private SomeRepository someRepository;
오버-모킹은 테스트의 복잡성을 높이고, 실제 로직의 동작을 제대로 검증하지 못하는 문제를 야기할 수 있습니다. 따라서 Mockito를 사용할 때는 최소한의 모킹만을 활용하며, 테스트의 목적과 범위를 명확히 정의하여 효과적인 단위 테스트를 작성해야 합니다. 다음 섹션에서는 Stubbing의 재사용에 대해 알아보겠습니다.
Mockito에서 Stubbing은 특정 메소드 호출에 대한 예상되는 동작을 정의하는 과정입니다. Stubbing의 재사용은 여러 테스트 케이스에서 동일한 Stubbing 설정을 반복적으로 활용하려는 경우에 중요한 주제입니다. 이 장에서는 Stubbing을 효과적으로 재사용하는 방법에 대해 알아봅니다.
@BeforeEach
어노테이션을 사용하여 각 테스트 메소드 실행 전에 공통의 Stubbing을 설정할 수 있습니다.@Mock
private SomeRepository someRepository;
@BeforeEach
public void setUp() {
when(someRepository.findByName("testName")).thenReturn(Optional.of(new Entity()));
}
private void stubDefaultBehavior() {
when(someRepository.findById(1L)).thenReturn(Optional.of(new Entity()));
}
@Test
public void someTest() {
stubDefaultBehavior();
// ...
}
Stubbing의 재사용은 Mockito를 사용하여 Spring Boot 환경에서 테스트를 작성할 때 중요한 고려사항 중 하나입니다. 적절한 재사용은 코드의 중복을 줄이고 유지보수를 용이하게 만들지만, 과도한 재사용은 테스트의 의도와 가독성을 해칠 수 있습니다. 따라서 적절한 균형을 찾아 재사용을 진행하십시오. 다음 섹션에서는 Mock 객체의 리셋에 대해 알아보겠습니다.
Mock 객체는 Mockito를 사용하여 생성되며, 테스트 케이스의 실행 동안 해당 객체에 대한 호출 및 반환 값을 기록합니다. 때로는 여러 테스트에서 동일한 Mock 객체를 재사용하려는 경우나, 특정 테스트의 특정 부분에서 Mock의 상태를 초기화하고 싶을 때가 있습니다. 이러한 경우, Mock 객체의 리셋이 필요합니다.
reset()
메서드를 통해 Mock 객체를 쉽게 리셋할 수 있습니다.@Mock
private SomeService someService;
@Test
public void testMethodA() {
when(someService.method()).thenReturn("ResponseA");
// 테스트 로직...
reset(someService); // Mock 객체 리셋
}
@Test
public void testMethodB() {
when(someService.method()).thenReturn("ResponseB");
// 테스트 로직...
}
@BeforeEach
어노테이션을 활용하여 테스트 메소드 실행 전에 자동으로 Mock 객체를 초기화하게 설정하는 것이 좋습니다.Mock 객체의 리셋은 Mockito의 고급 기능 중 하나로, 특정 상황에서 매우 유용할 수 있습니다. 그러나 남용은 테스트의 복잡성을 높일 수 있으므로 신중하게 사용해야 합니다. 테스트의 독립성과 명확성을 유지하기 위해서는 각 테스트 케이스에서 독립적인 Mock 객체를 사용하는 것이 가장 좋습니다. 다음 섹션에서는 Argument Matchers의 활용에 대해 알아보겠습니다.