6

我有一个带有静态方法的类,我目前正在用 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();
        }

    }
}

有任何想法吗?

4

1 回答 1

5

而不是“多次模拟方法”,您应该在一个记录中记录多个连续的返回值:

public class MyClassTest extends TestCase
{
    @Test
    public void testMyClass(@Mocked Foo anyFoo)
    {
        new Expectations() {{
            Foo.getValue(any);
            result = Foo.FooValue.values();
        }};

        for (Foo.FooValue val : Foo.FooValue.values() {
            myClass.doSomething();
        }
    }
}

Delegate如果需要更大的灵活性,也可以使用 .

于 2011-02-08T14:12:16.120 回答