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

@MockBean:

@MockBean

MyService myservice;

@嘲笑:

@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{...}

Spring Boot库包装Mockito库

这确实是一个Spring Boot类:

import org.springframework.boot.test.mock.mockito.MockBean;

...

@MockBean

MyService myservice;

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

它允许在Spring ApplicationContext中添加Mockito模拟。

如果上下文中存在与声明的类兼容的bean,则将其替换为模拟。

如果不是这种情况,它将在上下文中将模拟作为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.

什么时候使用经典/普通Mockito以及何时从Spring Boot使用@MockBean?

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

因此,这是一个简单的准则:

当您编写不需要从Spring Boot容器中获取任何依赖项的测试时,遵循经典/普通Mockito的方法是:它快速且有利于隔离测试的组件。

如果您的测试需要依赖于Spring Boot容器,并且您还想添加或模拟其中一个容器bean,则可以使用Spring Boot中的@MockBean。

Spring Boot @MockBean的典型用法

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

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

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

}

}

是否将使用@MockBean创建bean的副本并将其注入ApplicationContext?还是将模拟bean的所有方法都设置为null?如果所有方法都为null,是否可以像使用@Mock一样对它们进行存根处理?

如前所述,如果在Spring配置中已经定义了声明相同类型的bean,则在应用程序上下文中使用@MockBean将替换bean。然后在声明@MockBean.的类中执行注入。DI机制以这种方式工作:在DI上下文中注册一个对象,然后可以在特定类中注入Spring上下文中引用的对象。您不要在DI上下文中注入对象。

最后,它很容易解释。如果仅查看注释的javadocs,您将看到不同之处:

@模拟:(org.mockito.Mock)

Mark a field as a mock.

Allows shorthand mock creation.

Minimizes repetitive mock creation code.

Makes the test class more readable.

Makes the verification error easier to read because the field name is used to identify the mock.

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

Annotation that can be used to add mocks to a Spring ApplicationContext. Can be used as a class level annotation or on fields in either @Configuration classes, or test classes that are @RunWith the SpringRunner.

Mocks can be registered by type or by bean name. 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.

When @MockBean is used on a field, as well as being registered in the application context, the mock will also be injected into the field.

Mockito.mock()

Its just the representation of a @Mock.

别忘了@Mock需要手动调用MockitoRunner或initMocks。

@MockBean和@Mock之间唯一的区别是一个将模拟内容注入到Spring ApplicationContext中,而另一个不会吗?

@Doug您总结得很好,但需要记住MockBean是Spring Boot的一部分

我可以看到的1个区别是@Mock使模拟对象具有该类类型的默认值,其中默认情况下使用@MockBean创建的模拟对象被分配了Null值。为了在测试类中显式地使用它,我们需要再次实例化它。

这是不正确的。如果@MockBean注释的字段将始终为null,那么这种注释的目的是什么?

mock()java,关于java:@ Mock,@ MockBean和Mockito.mock()之间的区别相关推荐

  1. java中static、final 和 static final之间的区别

    java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...

  2. java mock什么意思_java @Mock, @MockBean 与 Mockito.mock( ) 之间的差异

    纯Mockito库import org.mockito.Mock; ... @Mock MyService myservice; 和import org.mockito.Mockito; ... My ...

  3. java 逻辑或 作用_Java开发中与之间的区别,你真的知道吗?

    &与&& 首先来讲一下&&,这个在java逻辑运算符里面被称为短路与,它与&逻辑与只差了一个& ,但是区别却很大,它的作用是如果前面的表达式运行 ...

  4. Java中 break、continue 和 return三者之间的区别

    一.Java break 可以直接强行退出当前的循环,忽略循环体中任何其他语句和循环条件测试 以下实例使用了 break 关键字来跳出当前循环: public class Main {public s ...

  5. IO流介绍、java常用的几个IO流类之间的区别,以及各自的用法、使用场景

    1. IO流介绍 IO流(Input Output Stream,输入输出流),表示数据在程序内存和磁盘之间的传输.按照数据流的流向不同分为输入.输出流,输入流表示程序从磁盘读入数据,输出流表示程序往 ...

  6. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  7. java e e_java – e.getMessage()和e.getLocalizedMessage()之间的区别

    正如大家上面提到的 – 据我了解,getMessage()返回异常的名称. getLocalizedMessage()以用户的本地语言(中文,日语等))返回异常的名称.为了使这个工作,您调用getLo ...

  8. java有var吗_java – Var和Var之间的区别

    tldr; 虽然var和var都会将它们应用到的变量增加,但var返回的结果是变量在递增前的值,而var返回的结果是应用增量后的变量值. 进一步说明 当var或var形成完整的语句(如在你的例子中), ...

  9. java dateformat hh_SimpleDateFormat上的Java HH:mm和hh:mm之间的区别

    kk:mm,HH:mm和hh:mm格式有何区别? SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss"); broke ...

最新文章

  1. 思科预计全球云数据流量将以66%的混合年增长率递增
  2. Python基础(6)--条件、循环
  3. 对数组下面的数组截取_numpy数组不同索引方式的区别
  4. 数据结构学习笔记:时间复杂度
  5. 11gR2 Grid Infrastructure Installation prerequisites On LINUX
  6. IIS故障问题(Connections_Refused)分析及处理
  7. 数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)
  8. Linux 登录 帐号 cmccedu 无线,CMCC CMCC-EDU路由器绑定自动登录方法详细教程!
  9. 关键字 surper 和 this
  10. 求java用人民币来转换美元,NJUPT JAVA语言 综合图形界面程序设计
  11. ps更换证件照的背景色
  12. 酒店管理系统(C语言)
  13. UTL_FILE包的使用解析
  14. ASP.NET 数据绑定详解 代码+步骤
  15. 【华为云技术分享】最终,我决定将代码迁出x86架构!
  16. 20210829-基于CentOS7/Linux配置ssh免密登录
  17. 【ZJOI 2009】狼和羊的故事
  18. 百年孤独人物脉略简介
  19. 计算机毕业设计情况进展记录表,毕业设计(论文)中期检查记录表
  20. 医学研究生常用软件介绍

热门文章

  1. pktgen:DPDK流量生成器
  2. 网站主机 技术+类型
  3. 架构设计 之 你为啥只垂直切子系统没分层呢?
  4. cookie代码加时间多久出现一次_JavaWeb——Cookie详解
  5. hive 如何将数组转成字符串_hive 将hive表数据查询出来转为json对象和json数组输出...
  6. BioSPPy - Biosignal(生物信号处理库)
  7. MAX_VALUE的最大值和最小值是多少
  8. Java中的IO学习总结
  9. netty的channel介绍
  10. 关闭裁剪功能_SOLIDWORKS 2021 新增功能—3D CAD