我在单元测试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对象创建了一个模拟器。当我们模拟对象时,我期望的状态改变消失,因为合并(...)操作永远不会被调用。我可以尝试只验证使用foo1和foo2的正确实例调用merge(...),但后续的copySomeValues(...)调用仍会抛出NullPointerException。
有什么建议吗?
答案 0 :(得分:3)
除非我误解你,否则你将mergingObject设置为mock,但是你没有设置mock的行为。你需要告诉模拟的mergingObject,当调用.merge时,返回一些东西。那些东西可以是你喜欢的东西,你可以验证process()返回的对象是同一个对象。
您可以在mockito中使用存根语法设置行为。我从来没有使用过mockito但是看过这个网站就是这样的
when(mergingObject.merge(something, somethingelse).return(new Foo());
你需要注意如何指定forsomething和其他东西的参数,以便它们匹配你的foo1和foo2
答案 1 :(得分:0)
我从你发布的内容中注意到的是,你所测试的内容以及原因尚不清楚。
鉴于Merge已被委托给另一个将拥有自己的测试集的类。 我会创建一个foo1和一个foo3来测试CopySomeValues。合并根本没有特色。