我有一个带有静态方法的类,我目前正在用 JMockit 模拟。说它看起来像:
public class Foo {
public static FooValue getValue(Object something) {
...
}
public static enum FooValue { X, Y, Z, ...; }
}
我有另一个类(我们称之为 MyClass)调用 Foo 的静态方法;我正在尝试为这个类编写测试用例。我的 JUnit 测试使用 JMockit,看起来像这样:
public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;
@Test public void testMyClass() {
new Expectations() {
{
Foo.getValue((Object) any); result = Foo.FooValue.X;
}
};
}
myClass.doSomething();
}
这很好用,而且当测试执行时,我的 MyClass 实例在调用 Foo.getValue() 时将正确获取 Foo.FooValue.X 的枚举值。
现在,我正在尝试遍历枚举中的所有值,并反复运行测试。如果我将上面的测试代码放在一个 for 循环中,并尝试将模拟的静态方法的结果设置为每个枚举值,那是行不通的。Foo.getValue() 的模拟版本总是返回 Foo.FooValue.X,并且在我遍历枚举时永远不会返回任何其他值。
如何在单个 JUnit 测试中多次模拟静态方法?我想做这样的事情(但显然它不起作用):
public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;
@Test public void testMyClass() {
for (final Foo.FooValue val : Foo.FooValue.values() {
new Expectations() {
{
// Here, I'm attempting to redefine the mocked method during each iteration
// of the loop. Apparently, that doesn't work.
Foo.getValue((Object) any); result = val;
}
};
myClass.doSomething();
}
}
}
有任何想法吗?