当前位置: 首页 > 知识库问答 >
问题:

@mock、@mockBean和mockito.mock()之间的区别

乌翰学
2023-03-14
@MockBean
MyService myservice;
@Mock
MyService myservice;

mockito.mock()

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

共有1个答案

龙俊良
2023-03-14

普通仿基托图书馆

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

而且

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

来自Mockito库,功能等同。
它们允许模拟类或接口,并记录和验证其上的行为。

@Before 
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}
@RunWith(org.mockito.runners.MockitoJUnitRunner.class)
public MyClassTest{...}

Spring Boot库包装模拟库

这的确是一堂春靴课:

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

类包含在spring-boot-test库中。

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

因此,这里有一个简单的指南:

当您编写一个不需要来自Spring Boot容器的任何依赖项的测试时,可以遵循经典/普通的Mockito:它速度快,并且有利于被测试组件的隔离。
如果您的测试需要依赖Spring Boot容器,并且您还想添加或模拟一个容器bean:@mockbean来自Spring Boot是一种方法

Spring Boot的典型用法@mockbean

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

Spring引导文档很好地总结了这一点:

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

}
 类似资料:
  • 问题内容: 方法和注释之间有什么区别?他们是一样的吗? 例如,这是: 与: 问题答案: 它们都达到相同的结果。通常不会使用注解(),因为您不会用看起来都一样的样板分配来填充代码。 请注意,为了使用注释,您的测试类应在其方法中进行注释或包含对的调用。

  • 问题内容: 和框架有什么区别? 问题答案: 创建一个模拟。创建该类的实例,并将使用(或)注释创建的模拟注入该实例。 请注意,你必须使用或初始化这些模拟并注入它们。

  • 我正在用它来实现一个模拟来调用我的抽象类。 但我的问题是,我的抽象类有太多的依赖关系是自动连接的。子类是。如果它不是一个抽象类,我会使用@InjectMocks来注入这些模拟依赖项。而是如何将mock添加到我上面给出的实例中。 在此处简化代码版本/ 我的Junit是

  • Mockito框架中的和有什么区别?

  • 我在spring boot项目中为我们的服务类编写单元测试。当我自动连接正在测试的类时,测试正常运行,当我使用@MockBean insead of @Autowire时,测试失败。 有人能帮我区别一下@MockBean失败的原因吗?另外,在mockito中有一种模仿autowired类(当前类)方法的方法。

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子: