将值设置为模拟对象,但获取 null

2022-09-02 11:28:29

我有一个简单的类要嘲笑: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();

我设置了模拟对象,但是当我调用 getter 来获取名称时,它会返回 nullname

这是一个 Mockito 特定问题,还是一个模拟对象无法设置值的约定?为什么?被嘲笑的对象下面发生了什么?


答案 1

好吧,是的 - 实际的代码并不重要,因为你是在嘲笑它......而Mockito不知道和之间有一种关系。它不假设它应该将参数存储到并在调用时返回它...它可以做到这一点,但据我所知,它没有。Mockito提供的模拟只允许您指定在其上调用方法时发生的情况,并检查以后调用的内容。而不是调用 ,您可以模拟调用并指定它应该返回的内容...FoosetNamegetNamesetNamegetNamesetNamegetName()

...或者你可以直接使用而不是嘲笑它。不要以为你必须嘲笑测试中的所有内容。只是嘲笑(或假)当你使用真正的类时很尴尬的东西,例如,因为它使用文件系统或网络。Foo


答案 2

默认情况下,mockito 在 mocked 对象中的任何方法上都没有行为。

您应该执行如下操作:

Foo mockedFoo = Mockito.mock(Foo.class);
when(mockedFoo.getName()).thenReturn("someName");
String name = mockedFoo.getName();

编辑:正如Jon Skeet所提到的,你不应该嘲笑那些可以以正常方式测试的东西。


推荐