我有一个简单的类Foo
要被嘲笑:
public class Foo { private String name; public Foo() { } public Foo(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } }
在我的单元测试代码中,我使用Mockito来模拟它.
Foo mockedFoo = Mockito.mock(Foo.class); mockedFoo.setName("test"); // name is null String name = mockedFoo.getName();
我设置name
了模拟对象,但是当我调用getter获取名称时,它返回null.
它是一个Mockito特定的问题还是一个惯例,模拟对象不能设置值?这是为什么?下面用模拟对象发生了什么?
是的 - 实际的代码Foo
并不重要,因为你在嘲笑它......而且Mockito不知道那里的意思是setName
和之间的关系getName
.它不会假设它应该存储参数setName
并在getName
调用时返回它...它可以做到这一点,但它并没有我所知.通过提供的Mockito模拟只允许您指定的方法被调用它会发生什么,并检查什么是所谓的以后.setName
你可以模拟一个调用getName()
并指定应该返回的内容,而不是调用...
...或者你可以直接使用Foo
而不是嘲笑它.不要以为你必须在测试中模拟一切.只是模拟(或伪造)当你使用真实类时很尴尬的东西,例如因为它使用文件系统或网络.
默认情况下,mockito对模拟对象中的任何方法都没有行为.
你应该做这样的事情:
Foo mockedFoo = Mockito.mock(Foo.class); when(mockedFoo.getName()).thenReturn("someName"); String name = mockedFoo.getName();
编辑:正如Jon Skeet所提到的,你不应该嘲笑那些只能以正常方式进行测试的东西.