我想做一些类似的事情:
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)
的同一个枚举。
问题:有没有一种Mockito方法可以让我在不指定特定枚举的情况下测试它?
我知道我可以用
MyEnum myEnum = MyEnum.FIRST;
但是,这似乎有误导性,因为它表明我正在测试MyEnum.FIRST
特定的东西。
您正在向后考虑您的测试:您试图验证的MyClassUtils
对象的特征是:"无论MyEnum
的哪个实例被传递到它,它总是用同一实例调用myObject.method
"。
粗略翻译,这是:
∀x: x&left-arrow;MyEnum其中o&left-arrow;类名MyClassUtils.method(o,x)⇒o.method(x)
(请原谅我糟糕的数学编辑技巧。)
为了详尽地测试这个特性,您需要针对MyEnum
的每个可能值对其进行验证。您可以通过使用for
循环来轻松实现这一点,也可以使用类似JUnit Parameterized
的运行程序。
然而,这里可能不需要进行详尽的测试。相反,只需选择一个具有代表性的子集,该子集应能实现测试中系统的所有预期行为。用任意选择的MyEnum
元素进行测试是足够的,如果是这样,那么这样做也没有害处。
一种常见的方法是选择一个"sample"值并将其存储在测试类的常量中。通过显式,调试更容易:如果后来发现你的代表值根本不具有代表性,那么如果你有这个值,调试应该会更容易。
TL;DR:一个任意选择的值应该适合您的测试。如果不是,解决方案是在测试中更加详尽,而不是更加武断。