当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将值设置为模拟对象但获取null》经验,为你挑选了2个好方法。

我有一个简单的类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特定的问题还是一个惯例,模拟对象不能设置值?这是为什么?下面用模拟对象发生了什么?



1> Jon Skeet..:

是的 - 实际的代码Foo并不重要,因为你在嘲笑它......而且Mockito不知道那里的意思是setName和之间的关系getName.它不会假设它应该存储参数setName并在getName调用时返回它...它可以做到这一点,但它并没有我所知.通过提供的Mockito模拟只允许您指定的方法被调用它会发生什么,并检查什么所谓的以后.setName你可以模拟一个调用getName()并指定应该返回的内容,而不是调用...

...或者你可以直接使用Foo而不是嘲笑它.不要以为你必须在测试中模拟一切.只是模拟(或伪造)当你使用真实类时很尴尬的东西,例如因为它使用文件系统或网络.


确实; 根据我的经验,人们经常会在他们不应该的时候模仿"价值对象"课程.我过去考虑过的一件事是,如果测试试图模拟它们,然后抛出"无效的模拟"异常,那么模拟库检测这些类是个好主意.可能是一个很好的"选择加入"功能来添加(并且不太难实现).

2> Martin Hanse..:

默认情况下,mockito对模拟对象中的任何方法都没有行为.

你应该做这样的事情:

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

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

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有