그동안에 테스트를 진행할 때, 테스트의 분기와는 관계가 없는 어쩌면 자연스럽게 처리되어야 하는 Stub에 대해서는 @BeforeEach
문에 적는 경우가 많았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@ExtendWith(MockitoExtension.class) class FooServiceTest { @Mock private FooRepository fooRepository; @BeforeEach void beforeEach() { givenActionFooEntitySaved(); } private void givenActionFooEntitySaved() { when(fooRepository.save(ArgumentMatchers.any(FooEntity.class))).thenAnswer(invocation -> invocation.getArgument(0)); } } |
Spring Context를 사용하지 않는 이상, @Autowired
된 Bean들은 모두 Mock으로 생성을 해야 되는데,
테스트의 흐름과 관계없이 그냥 자연스럽게 되는 경우
(위의 케이스의 경우, FooEntity를 save()하면 저장하고, 다시 FooEntity를 return해주는)
각 테스트에서 모두 해당 메소드를 선언하는 것보다는 저렇게 @BeforeEach
를 활용하는 것이 더 깔끔하다고 생각했다.
물론 해당 Stub을 테스트 메소드마다 쓰는 경우도 있고, 쓰지 않는 경우가 있어 redundant한 느낌이 있지만 크게 개의치 않았다.
그런데 얼마 전부터 이런 오류가 발생한다.
1 2 3 4 5 6 7 8 9 10 |
org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected. Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at kr.co.freeism.service.FooServiceTest.givenActionFooEntitySaved(FooServiceTest.java:159) Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:211) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterEachCallbacks$11(TestMethodTestDescriptor.java:245) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$12(TestMethodTestDescriptor.java:256) |
redundant하게 stubbing을 했다고 해서 테스트 실패까지 만들어야 하나라는 의구심은 있지만,
어찌됐던 필요한 stubbing만 해야한다고 강제 가이드하고 있다.
모든 메소드에서 사용하는 구문이 아니면 @BeforeEach
를 통해서 stubbing을 할 수는 없을 것 같다.
핑백: Mockito에서 Multi-Stubbing 적용하기 - ThinkCUBES