복붙노트

[SPRING] @Mock, @MockBean 및 Mockito.mock ()의 ​​차이점

SPRING

@Mock, @MockBean 및 Mockito.mock ()의 ​​차이점

테스트를 만들고 조롱 의존성을 만들 때이 세 가지 접근 방식의 차이점은 무엇입니까?

해결법

  1. ==============================

    1.모히토 평야 도서관

    모히토 평야 도서관

    import org.mockito.Mock;
    ...
    @Mock
    MyService myservice;
    

    import org.mockito.Mockito;
    ...
    MyService myservice = Mockito.mock(MyService.class);
    

    Mockito 라이브러리에서 왔으며 기능적으로 동일합니다. 클래스 나 인터페이스를 조롱하고 그것에 대한 행동을 기록하고 검증 할 수 있습니다.

    주석을 사용하는 방법은 더 짧고, 그렇게 선호되고 종종 선호됩니다.

    테스트 실행 중에 Mockito 주석을 사용하려면 MockitoAnnotations.initMocks (this) static 메소드를 호출해야합니다. 테스트간에 부작용을 피하려면 각 테스트 실행 전에 수행하는 것이 좋습니다.

    @Before 
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }
    

    Mockito 주석을 사용하는 또 다른 방법은이 작업을 수행하는 MockitoJUnitRunner와 다른 유용한 것들을 지정하여 @RunWith로 테스트 클래스에 주석을다는 것입니다.

    @RunWith(org.mockito.runners.MockitoJUnitRunner.class)
    public MyClassTest{...}
    

    봄 부트 도서관 Mockito 라이브러리 포장

    이것은 실제로 Spring Boot 클래스입니다.

    import org.springframework.boot.test.mock.mockito.MockBean;
    ...
    @MockBean
    MyService myservice;
    

    이 클래스는 스프링 부트 테스트 라이브러리에 포함되어 있습니다.

    Spring ApplicationContext에 Mockito 모의 객체를 추가 할 수있다. 선언 된 클래스와 호환 가능한 bean이 컨텍스트에 존재하면, mock에 의해이를 대체합니다. 그렇지 않은 경우에는 컨텍스트에서 모의 ​​객체를 bean으로 추가합니다.

    Javadoc 레퍼런스 :

    Classic / plain Mockito를 사용할 때와 Spring Boot에서 @MockBean을 사용할 때?

    단위 테스트는 다른 구성 요소와 분리 된 구성 요소를 테스트하도록 설계되었으며 단위 테스트는 개발자 시스템에서 매일 수십 번 실행될 수 있으므로 실행 시간 측면에서 가능한 한 빨리 수행해야한다는 요구 사항이 있습니다.

    결과적으로 다음은 간단한 지침입니다.

    Spring Boot 컨테이너로부터 어떤 의존성도 필요로하지 않는 테스트를 작성할 때, 클래식 / 평범한 모 키토가 따라 올 수있는 방법이다. 테스트 된 컴포넌트의 분리가 빠르고 빠르다. 테스트가 스프링 부트 컨테이너에 의존해야하고 컨테이너 빈 중 하나를 추가하거나 조롱하고 싶다면 스프링 부트의 @MockBean이 필요합니다.

    스프링 부트 @MockBean의 일반적인 사용법

    @WebMvcTest (웹 테스트 슬라이스)로 주석이 달린 테스트 클래스를 작성할 때.

    스프링 부트 문서는 다음과 같이 요약합니다 :

    다음은 그 예입니다.

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.Mockito;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.boot.test.mock.mockito.MockBean;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(FooController.class)
    public class FooControllerTest {
    
        @Autowired
        private MockMvc mvc;
    
        @MockBean
        private FooService fooServiceMock;
    
        @Test
        public void testExample() throws Exception {
             Foo mockedFoo = new Foo("one", "two");
    
             Mockito.when(fooServiceMock.get(1))
                    .thenReturn(mockedFoo);
    
             mvc.perform(get("foos/1")
                .accept(MediaType.TEXT_PLAIN))
                .andExpect(status().isOk())
                .andExpect(content().string("one two"));
        }
    
    }
    
  2. ==============================

    2.결국 설명하기 쉽습니다. 주석의 javadoc을 살펴보면 다른 것을 볼 수 있습니다.

    결국 설명하기 쉽습니다. 주석의 javadoc을 살펴보면 다른 것을 볼 수 있습니다.

    @Mock : (org.mockito.Mock)

    @MockBean : (org.springframework.boot.test.mock.mockito.MockBean)

    Mockito.mock ()

  3. from https://stackoverflow.com/questions/44200720/difference-between-mock-mockbean-and-mockito-mock by cc-by-sa and MIT license