我在单元测试void方法和在依赖关系更改传递引用的状态时模拟依赖关系时遇到了问题。我知道在void方法上可以观察到副作用,也可以观察到行为,但我很难将这些准则应用于此代码。也有类似的问题,但我找不到任何关于州随后的地方变化的问题。我正在使用JUnit和Mockito。。。下面是我所说的代码的一个人工版本:
@Mock
MergingObject mergingObject;
@Override
public void process(Foo foo1) {
Foo foo2 = getAnInstanceOfFoo(); // private
Foo foo3 = mergingObject.merge(foo1, foo2); // public
foo1.copySomeValues(foo3);
}
这里的难题是,如果我为MergingObject对象创建一个mock。当我们模拟对象时,我期望的状态更改将消失,因为merge(…)操作从未被调用。我可以试着验证merge(…)是用foo1和foo2的正确实例调用的,但随后的copySomeValues(…)调用仍然抛出NullPointerException。
有什么建议吗?
除非我误解了你的意思,否则你将mergeObject设置为mock,但你没有设置mock的行为。您需要告诉模拟的mergeObject,当调用.mmerge时,返回一些东西。这个东西可以是你喜欢的任何东西,你可以验证process()返回的对象是否是同一个对象。
您可以在mockito中使用stubing语法设置行为。我从来没有用过mockito,但看看网站,它有点像这个
when(mergingObject.merge(something, somethingelse).return(new Foo());
您需要小心如何指定something和其他参数,以便它们与您的foo1和foo2 匹配
我从您发布的内容中注意到,您测试的内容和原因还远不清楚。
Given Merge已被委派给另一个类,该类将拥有自己的一组测试。我会创建一个foo1和一个foo3来测试CopySomeValues。合并根本不起作用。