java – @ Mock,@ MovieBean和Mockito.mock()之间的区别

在创建测试和模拟依赖项时,这三种方法之间有什么区别?

> @MockBean:

@MockBean
MyService myservice;

> @Mock:

@Mock
MyService myservice;

> Mockito.mock()

MyService myservice = Mockito.mock(MyService.class);

解决方法:

普通Mockito图书馆

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

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

来自Mockito图书馆,功能相同.
它们允许模拟类或接口,并记录和验证其上的行为.

使用注释的方式较短,因此是优选的,通常是首选的.

请注意,要在测试执行期间启用Mockito注释,请执行此操作
必须调用MockitoAnnotations.initMocks(this)静态方法.
为避免测试之间的副作用,建议在每次测试执行之前执行此操作:

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

另一种启用Mockito注释的方法是通过指定执行此任务的MockitoJUnitRunner以及其他有用的东西来使用@RunWith注释测试类:

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

包装Mockito库的Spring Boot库

这确实是Spring Boot class

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

该类包含在spring-boot-test库中.

它允许在Spring ApplicationContext中添加Mockito模拟.
如果在上下文中存在与声明的类兼容的bean,则它将由mock替换它.
如果不是这样,它会将上下文中的mock添加为bean.

Javadoc参考:

Annotation that can be used to add mocks to a Spring
ApplicationContext.

If any existing single bean of the same type defined in the context
will be replaced by the mock, if no existing bean is defined a new one
will be added.

使用classic / plain Mockito和使用Spring Boot的@MockBean时?

单元测试旨在与其他组件隔离地测试组件,单元测试也有一个要求:在执行时间方面尽可能快,因为这些测试可能每天在开发人员计算机上执行十几次.

因此,这是一个简单的指导方针:

当您编写一个不需要Spring Boot容器的任何依赖项的测试时,经典/普通Mockito就是遵循的方式:它很快并且有利于隔离测试组件.
如果您的测试需要依赖Spring Boot容器,并且您还想添加或模拟其中一个容器bean:Spring Boot中的@MockBean就是这样.

Spring Boot @MockBean的典型用法

当我们编写一个用@WebMvcTest(web测试切片)注释的测试类时.

The Spring Boot documentation很好地总结了这一点:

Often @WebMvcTest will be limited to a single controller and used in
combination with @MockBean to provide mock implementations for
required collaborators.

这是一个例子:

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"));
    }

}
上一篇:Mockito 2 让我们校验一些行为


下一篇:java – 使mocked方法返回传递给它的参数