Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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 Mockito:验证任何()参数是否相同_Java_Junit_Mockito - Fatal编程技术网

Java Mockito:验证任何()参数是否相同

Java Mockito:验证任何()参数是否相同,java,junit,mockito,Java,Junit,Mockito,我想做一些类似的事情: MyEnum myEnum = any(); // This is not allowed throws InvalidUseOfMatchersException MyClassUtils.method(myClass, myEnum); // Verify MyClassUtils.method(MyEnum) calls myClass.method(MyEnum) verify(myClass).method(myEnum); 我的想法是,我不在乎哪个枚举被

我想做一些类似的事情:

MyEnum myEnum = any();  // This is not allowed throws InvalidUseOfMatchersException
MyClassUtils.method(myClass, myEnum);

// Verify MyClassUtils.method(MyEnum) calls myClass.method(MyEnum)
verify(myClass).method(myEnum);
我的想法是,我不在乎哪个枚举被传递到
MyClassUtils#method(MyEnum)
,只要它是传递到
MyClass#method(MyEnum)
的同一个枚举

问题:有没有一种方法可以让我在不指定特定枚举的情况下测试这个问题


我知道我可以用:

MyEnum myEnum = MyEnum.FIRST;

但是,这似乎有误导性,因为它表明我正在测试特定于MyEnum.FIRST的东西

您正在向后考虑您的测试:您试图验证的
MyClassUtils
对象的特征是:“无论将
MyEnum
的哪个实例传递给它,它总是使用相同的实例调用
myObject.method

粗略地说,这是:

∀ x: x ← MyEnum where o ← MyClass MyClassUtils.method(o, x) ⇒ o.method(x) ∀ x:x&左箭头;髓鞘 其中o←类名 方法(o,x)⇒ o、 方法(x) (请原谅我糟糕的数学编辑技巧。)

要彻底测试此特性,您需要针对
MyEnum
的每个可能值对其进行验证。通过使用
for
循环,或者使用JUnit
参数化的运行程序,您可以轻松地完成这项工作

然而,此处可能不保证进行详尽的测试。取而代之的是,只需选择一个具有代表性的子集,该子集应能执行测试系统的所有预期行为。有可能使用任意选择的
MyEnum
元素进行测试就足够了,如果是这样的话,那么这样做没有什么害处

一种常见的方法是选择一个“sample”值并将其存储在测试类中的常量中。通过显式,调试更容易:如果后来发现您的代表性值毕竟不是代表性的,那么如果您的值就在那里,调试应该更容易


TL;DR:一个任意选择的值对于您的测试应该是合适的。如果不是,解决方案是在测试中更加详尽,而不是更加武断。

“但是,有没有一种Mockito方法可以让我在不指定特定枚举的情况下测试它?”为什么?你觉得有什么好处?@Tom我想这和你使用any()来更好地表达测试意图的原因是一样的。我不使用
any
来“告诉”我不关心某件事(至少大部分情况下),我用它来告诉你,我不知道某个参数,所以我愿意接受一切(是的,这意味着我也不在乎,因为我不使用ArgumentCatcher)。在这种情况下,我仍然会使用一个特定的枚举,并给它一个prober名称来告诉它,这只是一个随机选择的枚举。如果你仍然想使用一个真正的随机枚举,那么你可以使用
MyEnum w=MyEnum.values()[new random().nextInt(MyEnum.values()).length);
,但这看起来很难看。是的,这不是
任何()
用于。基本上,如果您希望在测试期间使用枚举的值,您必须选择一个。Mockito没有魔力。您期望什么?它测试所有枚举值?编写一个参数化测试。它测试一个随机枚举值?您自己确定该随机值。它测试模拟枚举值m值?枚举有点像是最终的,所以这里没有运气。你所问的没有多大意义-要么你想测试它是否适用于一个枚举值(因为这样它将适用于所有枚举值),要么你想测试它是否适用于所有枚举值-在这两种情况下,都这样做。如果你需要可读性,请编写一个
getRandomEnumValue()
方法。