spring boot/snippets

Spying 하는 방법

lingi04 2021. 12. 22. 23:16
...
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
...

@ExtendWith(SpringExtension.class)
public class TestTest {
    @Mock
    EntityRepository entityRepository;

    @AutoSource
    @ParameterizedTest
    public void create_test(Req req, Entity entity, String createUser) throws Exception {
        Req spyReq = spy(req);
        when(spyReq.toEntity(createUser)).thenReturn(entity);

        given(entityRepository.save(entity)).willReturn(entity);

        assertThrows(InvalidExtException.class, () -> entityService.create(spyReq, createUser));
    }
}

지금 보니 위의 코드는 뭔가 좀 이상한 코드네... Mocking 하는데 SpringExtension을 사용 할 필요는 없다.(과거의 나...ㅠㅠ)

대신 이렇게 사용하면 될것 같다.


@ExtendWith(MockitoExtension.class)
public class TestTest {
    // ExtendWith에 MockitoExtension을 넣고 이렇게 어노테이션을 사용 하면
    // Mock 객체가 주입이 됨.
    @Mock
    EntityRepository entityRepository;

    @AutoSource
    @ParameterizedTest
    public void create_test(Req req, Entity entity, String createUser) throws Exception {
        // 아니면 이런 식으로 static method를 import 해서 사용해도 됨.
        Req spyReq = spy(req);
        when(spyReq.toEntity(createUser)).thenReturn(entity);

        given(entityRepository.save(entity)).willReturn(entity);

        assertThrows(InvalidExtException.class, () -> entityService.create(spyReq, createUser));
    }
}

정리 하자면

  1. MockitoExtension을 사용하여 @Mock, @Spy 등을 써서 의존성 주입
  2. mock(), spy()같은 static method를 import 해서 사용