【发布时间】:2013-02-21 15:40:59
【问题描述】:
当依赖项更改传递引用的状态时,我无法对 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。
有什么建议吗?
【问题讨论】:
-
你可以在你的模拟对象上实现合并!不过不是很清楚,您不是说合并更改 foo1 和或 foo2 是吗?
-
如果我能做到,那就太有趣了。在这种情况下,合并会根据 foo1 和 foo2 的内容返回一个新实例。这需要后续的“复制”步骤。
-
以为你是在测试副作用一分钟。我对解决这个问题持 KISS 态度,消除副作用。
标签: java unit-testing junit tdd mockito