0

当依赖项更改传递的引用的状态时,我无法对 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。

有什么建议么?

4

2 回答 2

3

除非我误解了您,否则您将 mergingObject 设置为模拟,但您没有设置模拟的行为。您需要告诉模拟的 mergingObject 当 .merge 被调用时,返回一些东西。那东西可以是任何你喜欢的东西,你可以验证从 process() 返回的对象是同一个对象。

您可以使用 mockito 中的存根语法设置行为。我从来没有使用过mockito,但看看这个网站是这样的

when(mergingObject.merge(something, somethingelse).return(new Foo());

您需要注意如何为某事和其他事指定参数,以便它们与您的 foo1 和 foo2 匹配

于 2013-02-21T15:50:18.467 回答
0

我从您发布的内容中注意到的是,您正在测试什么以及为什么要测试的内容还很不清楚。

鉴于 Merge 已被委托给另一个类,该类将拥有自己的一组测试。我会创建一个 foo1 和一个 foo3 来测试 CopySomeValues。合并根本不会出现。

于 2013-02-21T21:21:09.743 回答