Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMockit&;多种局部方法_Java_Methods_Mocking_Jmockit - Fatal编程技术网

Java JMockit&;多种局部方法

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()中发生什么。有什么办法可以避免这

假设我有一个类MyClass,它的方法是
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的行为,而不是特定的实现。