【问题标题】:What is ongoingstubbing in mockito and where we use it?mockito 中的持续存根是什么以及我们在哪里使用它?
【发布时间】:2015-05-30 14:56:59
【问题描述】:

谁能解释一下mockito中正在进行的存根以及它如何帮助在Junit Testcase中编写和模拟方法。

【问题讨论】:

标签: junit mockito stubbing


【解决方案1】:

OngoingStubbing 是一个允许您指定响应方法调用的操作的接口。 您永远不需要直接参考 OngoingStubbing;所有对它的调用都应该在以when 开头的语句中作为链式方法调用发生。

// Mockito.when returns an OngoingStubbing<String>,
// because foo.bar should return String.
when(foo.bar()).thenReturn("baz");

// Methods like thenReturn and thenThrow also allow return OngoingStubbing<T>,
// so you can chain as many actions together as you'd like.
when(foo.bar()).thenReturn("baz").thenThrow(new Exception());

请注意,Mockito 至少需要调用一次 OngoingStubbing 方法,否则它将抛出 UnfinishedStubbingException。但是,直到您下次与 Mockito 交互时,它才知道存根未完成,因此这可能是非常奇怪的错误的原因。

// BAD: This will throw UnfinishedStubbingException...
when(foo.bar());

yourTest.doSomething();

// ...but the failure will come down here when you next interact with Mockito.
when(foo.quux()).thenReturn(42);

虽然技术上可以保留对 OngoingStubbing 对象的引用,但 Mockito 没有定义该行为,通常被认为是一个非常糟糕的主意。这是因为 Mockito 是有状态的,并且 operates via side effects during stubbing

// BAD: You can very easily get yourself in trouble this way.
OngoingStubbing stubber = when(foo.bar());
stubber = stubber.thenReturn("baz");
stubber = stubber.thenReturn("quux");

【讨论】:

  • 保留对 OngoingStubbing 对象的引用,因为 end 用户只是不这样做。它不是这样设计的。引用 OngoingStubbing 的唯一合理理由是,当人们在 mockito 之上开发功能时,它需要了解 mockito 的内部工作原理。
  • 还是真的吗?给定链接不存在并且文档static.javadoc.io/org.mockito/mockito-core/2.2.9/org/mockito/… 没有提到我们永远不需要直接引用 OngoingStubbing?
  • @user 谢谢;该链接只是指向您在评论中链接的页面。需要明确的是,OngoingStubbing 是 Mockito 的 DSL(领域特定语言)的关键部分;您将与 OngoingStubbing频繁交互,并调用其上定义的方法并通过 when 返回。也就是说,正如 Mockito 贡献者 Brice 在上面确认的那样,您不需要 将 OngoingStubbing 实例保存到字段按名称引用 OngoingStubbing(除非,比如说,您正在编写像 PowerMock 这样的 Mockito 扩展 API)。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2017-10-02
相关资源
最近更新 更多