什么时候避免嘲笑?

lis*_*sak 1 java unit-testing mocking

模拟的最常见用例是

objA uses objB;
use objA without having objB populated/initialized
Run Code Online (Sandbox Code Playgroud)

以便

@Mock
private UserInterface userInterface;

public void method() {
   MockitoAnnotations.initMocks(this);
   Client client;
   client.setUserInterface(userInterface);
   when(userInterface.getSomething()).thenReturn(new OutputType("f"));
   client.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们实际上只需要objA的OUTPUT呢?假设我们不想调用objA.doSomething();那个返回SomeOutput来获取SomeOutput,所以我们可以

  1. 为doSomething()模拟它以返回SomeOutput; - 没有多大意义

  2. 填充变量,new SomeOutput(bla, bla, bla);而不是嘲笑任何东西.

我问,因为我看到程序员嘲笑第二种方式,实际上没有意义,因为他们只是实例化new SomeOutput(bla, bla, bla);并通过模拟的objA返回它;

它有任何秘密目的吗?我对嘲笑比较陌生.

Jon*_*eet 12

当您想要测试组件之间的交互时,模拟是很好的.

当您不关心交互时,存根和假货很棒,但您希望一个组件能够向另一个组件提供数据.与使用模拟框架相比,这些最终可能需要更长时间才能创建,但随后编写更多测试通常会更容易.许多模拟框架也提供了存根功能.

对于已经过测试的足够简单的类型(通常提供数据而不是服务),只需使用真实类型.

请参阅Martin Fowler关于模拟和存根的文章,以获得更多启示.