【问题标题】:Mock a static method multiple times using JMockit within a JUnit test在 JUnit 测试中使用 JMockit 多次模拟静态方法
【发布时间】:2011-06-21 16:50:17
【问题描述】:

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

    }
}

有什么想法吗?

【问题讨论】:

  • 您确定您的期望在 FooValue.X 以外的值上正常工作(在第一种情况下)?

标签: java methods junit static jmockit


【解决方案1】:

与其“多次模拟方法”,不如在一次记录中记录多个连续的返回值:

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 来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多