什么是mockito中正在进行的存根以及我们在哪里使用它?

Gow*_*san 4 junit mockito stubbing

谁能解释一下在嘲讽中正在进行的存根及其如何帮助在Junit Testcase中编写和嘲笑方法。

Jef*_*ica 5

OngoingStubbing是一个接口,可让您指定响应呼叫的操作。您永远不需要直接参考OnglingStubbing;所有对它的调用均应以开头的语句中的链接方法调用的形式发生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());
Run Code Online (Sandbox Code Playgroud)

请注意,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);
Run Code Online (Sandbox Code Playgroud)

尽管从技术上讲可以保留对OngoingStubbing对象的引用,但是Mockito并未定义该行为,通常认为这是一个非常糟糕的主意。这是因为Mockito是有状态的,并且在存根期间会通过副作用进行操作

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

  • _保持对 OngoingStubbing 对象的引用_,因为 _end_ 用户只是不这样做。它不是这样设计的。引用 `OngoingStubbing` 的唯一合理理由是,当一个人在 mockito 之上开发一个功能时,它需要了解 mockito 的内部工作原理。 (2认同)