4

假设我有带有方法的 MyClass 类x()y()并且z(). 比方说x()cally()y()call z()

所以每次我x()都测试y()并被z()调用。在模拟 MyClass 的依赖关系的情况下,我将不得不模拟内部的依赖关系行为x()y()z().

因此,如果我对方法的测试x()testXWhen1(),我将不得不在每个测试方法中重复对我的依赖项的期望。最后,我有一些代码,其中包含对内部发生的事情的期望,并重复了我的三种测试方法。有什么办法可以避免这种情况吗?testXWhen2()testXWhen3()y()z()

我的一个想法是尝试测试实际的x()方法,但是嘲笑y()z(). 在那种情况下,我的实例MyClass应该部分是模拟的,部分是真实的MyClass。可能吗?

另一个解决方案是对 中的期望严格,但对在and中x()发生的事情不严格……我想我可以用代替来做到这一点,但这不是我最喜欢的解决方案。y()z()@NonStrict@Mocked

4

3 回答 3

2

如果你想测试方法x(),那么你应该模拟方法y()。在这种情况下,不需要模拟z(),因为你永远不会在(y 被模拟)z()内部调用。在不同的测试中测试你的 x、y 和 z 方法。y()使用 PowerMock。它有createPartialMock方法。

于 2011-12-13T07:43:17.050 回答
0

最后,我有一些代码对我的三个测试方法重复的 y() 和 z() 内部发生的事情的期望。有什么办法可以避免这种情况吗?

您是否尝试过“提取方法”重构?

另一个解决方案是严格控制 x() 中的期望,而不是严格控制 y() 和 z() 中发生的事情......

这正是我在测试特定功能(尽管使用 JMock)时所做的 - 如果我正在测试的行为不依赖于调用依赖项的结果,我将明确使用 JMock 忽略/允许期望。它使测试的意图更加清晰,并专注于正在测试的内容。

于 2011-12-13T12:25:25.587 回答
0

您可以通过在构造函数中传递要部分模拟的类或对象来使用 JMockit 的动态部分模拟Expectations/NonStrictExpectations功能。

不过,一般来说,最好避免使用部分模拟,因为它通常表明被测代码缺乏凝聚力,并导致测试更难理解。

对于在多个测试中需要一堆相同期望的情况,总是可以选择创建可重用的期望块。您可以在命名的“”子类中封装许多期望XyzExpectations,可选地使用参数化构造函数,并在任意数量的测试中实例化它(实际实例化的“期望”子类必须是final)。验证块也可以这样做。

于 2011-12-15T20:44:27.700 回答