当依赖项更改传递引用的状态时,我无法对 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 对象创建一个模拟。当我们模拟对象时,我期望的状态更改会消失,因为 merge(...) 操作永远不会被调用。我可以尝试验证是否使用 foo1 和 foo2 的正确实例调用了 merge(...),但后续的 copySomeValues(...) 调用仍然抛出 NullPointerException。
有什么建议吗?
最佳答案
除非我误解你的意思,否则你将 mergingObject 设置为模拟,但没有设置模拟的行为。您需要告诉模拟的 mergingObject,当调用 .merge 时,返回一些内容。这个东西可以是你喜欢的任何东西,你可以验证 process() 返回的对象是否是同一个对象。
您可以使用mockito中的 stub 语法来设置行为。我从来没有使用过mockito,但是看看这个网站,它是这样的
when(mergingObject.merge(something, somethingelse).return(new Foo());
您需要小心如何指定某些内容和其他内容的参数,以便它们与您的 foo1 和 foo2 匹配
关于java - 单元测试无效带有随后续操作改变状态的依赖项的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006282/