Java JMockit&;多种局部方法
假设我有一个类MyClass,它的方法是Java JMockit&;多种局部方法,java,methods,mocking,jmockit,Java,Methods,Mocking,Jmockit,假设我有一个类MyClass,它的方法是x(),y()和z()。比如说x()调用y(),和y()调用z() 所以每次我测试x()时,都会调用y()和z()。在模拟MyClass的依赖项的情况下,我必须模拟x()、y()和z()中的依赖项行为 因此,如果我对方法x()的测试是testXWhen1(),testXWhen2()和testXWhen3()的话,我必须在每个测试方法中重复我的依赖性预期。最后,我为我的三种测试方法重复了一些代码,这些代码期望在y()和z()中发生什么。有什么办法可以避免这
x()
,y()
和z()
。比如说x()
调用y()
,和y()
调用z()
所以每次我测试x()
时,都会调用y()
和z()
。在模拟MyClass的依赖项的情况下,我必须模拟x()
、y()
和z()
中的依赖项行为
因此,如果我对方法x()
的测试是testXWhen1()
,testXWhen2()
和testXWhen3()
的话,我必须在每个测试方法中重复我的依赖性预期。最后,我为我的三种测试方法重复了一些代码,这些代码期望在y()
和z()
中发生什么。有什么办法可以避免这种情况
我的一个想法是尝试测试实际的x()
方法,但要模拟y()
和z()
。在这种情况下,MyClass
的实例应该部分是模拟的,部分是真实的MyClass
。可能吗
另一个解决方案是严格控制
x()
中的期望值,而不是严格控制y()
和z()
中发生的情况。。。我想我可以用@NonStrict
而不是@mock
,但这不是我最喜欢的解决方案。如果你想测试方法x()
,那么你应该模拟方法y()
。在这种情况下,没有必要也模拟z()
,因为你永远不会在y()中调用z()
(y是模拟的)。在不同的测试中测试x、y和z方法。使用PowerMock。它有createPartialMock
方法
最后,我为我的三个测试方法重复了一些代码,期望在y()和z()中发生什么。有什么办法可以避免这种情况
您是否尝试过“提取方法”重构
另一个解决方案是严格控制x()中的期望值,而不是y()和z()中发生的情况
这正是我在测试特定功能时所做的(尽管使用JMock)——如果我正在测试的行为不依赖于依赖性调用的结果,我将显式使用JMock忽略/允许期望。它使测试的意图更加清晰,重点放在测试的确切内容上。您可以使用JMockit的动态部分模拟功能,方法是在期望值/NonStrictExpectations
构造函数中传递要部分模拟的类或对象
但是,一般来说,最好避免使用部分模拟,因为它通常表明被测代码缺乏内聚性,并导致更难理解的测试
对于在多个测试中需要一组相同的期望的情况,始终可以选择创建可重用的期望块。您可以使用参数化构造函数将许多期望封装在命名的“
xyzexpections
”子类中,并在任意数量的测试中实例化它(实际实例化的“期望”子类必须是final
)。验证块也可以这样做。我认为从测试“方法”的角度考虑是没有用的——这是您要测试的SUT的行为,而不是特定的实现。