美文网首页
Junit 中mock和stubs的使用

Junit 中mock和stubs的使用

作者: John_bee3 | 来源:发表于2017-09-17 23:32 被阅读0次

最近面试被问到了关于Mocks和Stubs的问题,结果跪了,痛下决心学习这个知识点,要看懂这篇文章提前应该是在了解并且会使用JUnit的基础上。

Mocks 和Stubs主要区别不是what they are,而是how they are used。

Stubs一般用来stub out那些难于创建或操纵的对象。一个经典的例子就是一个database connection。因此,一般的stub都被发现于系统边界,或者围绕着系统中复杂的对象群。为了建立一个stub,你建立了一个接口的另一种实现,利用简单的数据替换了真实的方法。

大多数团队一般编写custom stubs来stub任何需要的服务,毕竟数目并不多,而且它们经常可以在test cases之间复用。因此,你不需要构建一个通用的stub定义库。而利用mock库是可以很好地创建stub的。

因为其在测试中所担任的角色,大部分stub的实现就是对于带特定参数的方法调用返回已定义好的数据。在mock社区看来,最本质的区别就在于mock所具有的expectation setting机制,利用此机制可以测试mock上哪些方法被调用了。Mockists通常把一个刚刚返回值的mock object叫做’just a stub’。所以,一种观察mocks和stubs的区别的方法就是在使用mock的时候人们是把建立并且测试expectations当作测试的一部分的。似乎太简单了点 - 我也曾经编写过做一些简单形式expectation检查的stub(这些检查可能是设置一个布尔值来代表某个method是否被调用)。但是我想我们有理由认为expectations对于stubs来说是一种稀有的特性,而对于mocks来说是主要的特性。

最大的问题并不真的是mocks和stubs的区别,真正关心的是interaction和state style的对比。Interaction-based testers对于所有次要对象编写mocks。State-based testers仅仅对于那些不实际使用real object的object编写stubs (比如external services、开销很大的东西、cache等等)。

很有必要强调这一点,因为我也曾经多次感到迷惑。State based testers不避免使用stubs(或者mocks来实现stubs) - 他们只是在必须要的情况下才用。Interaction testers随时使用mocks,就算真实的次要对象用起来也一样容易。

Junit 中除了这两种测试方法之外还有另外几种(怕翻译的不好直接贴了英文原版):

英文原版URL: https://martinfowler.com/articles/mocksArentStubs.html

Dummy objects are passed around but never actually used. Usually they are just used to fill parameter lists.

Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production (an in memory database is a good example).

Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test.

Spies are stubs that also record some information based on how they were called. One form of this might be an email service that records how many messages it was sent.

Mocks are what we are talking about here: objects pre-programmed with expectations which form a specification of the calls they are expected to receive.

相关文章

  • Junit 中mock和stubs的使用

    最近面试被问到了关于Mocks和Stubs的问题,结果跪了,痛下决心学习这个知识点,要看懂这篇文章提前应该是在了解...

  • Mock or Stubs

    晚上团队对于单元测试编写发生了不小的争论,在此之前我对单元测试的几种模式并不是特别清楚,晚上阅读了几篇文章。学习到...

  • 使用Mockito进行单元测试

    一、使用JUnit + Mockito进行单元测试 Java中的Mock工具有很多,比如Mockito, jMoc...

  • Mock和Mockito简介

    本篇对Mock和Mockito做了简单的介绍,并列出了简单的示例.使用Mockito需要基于JUnit,所以不了解...

  • Jmockit(一): 入门

    1 pom配置 testng + jmockit,使用junit也可以 2 程序结构 三步走: 录制,mock方法...

  • 使用 Mockjs 模拟数据

    Mock 数据 Mock 在 vue 中的使用 使用npm下载mock 2.使用 mock 在 mock 文件夹下...

  • Robolectric框架的使用

    可以参考地址: 1.Android单元测试(一):JUnit框架的使用 2.Android单元测试(二):Mock...

  • PowerMock简介

      Java单元测试框架主要有JUnit和TestNG,常用的Mock框架主要有EasyMock、Mockito和...

  • mountebank配置(二)

    上一篇中对stubs配置做了介绍,该篇对imposter和stubs在上一篇中没有提及的配置进行简短的介绍,该篇内...

  • 自动装配bean 2.2节

    使用junit测试,自动装配 不是junit测试的话,会在web.xml中配置识别注解的xml junit使用下面...

网友评论

      本文标题:Junit 中mock和stubs的使用

      本文链接:https://www.haomeiwen.com/subject/uczmsxtx.html