使用模拟实例参数的预期静态方法的MissingInvocation

时间:2015-02-05 11:55:28

标签: java unit-testing jmockit

我正在使用JMockIt 1.8 ,我有以下类:

public class SimpleUser {
    public static void useSimple(final SimpleClass simple) {
        System.out.println("useSimple called");
    }

    public void createAndUse() {
        final SimpleClass simple = new SimpleClass();
        simple.method();
        SimpleUser.useSimple(simple);
    }
}

public class SimpleClass {
    public void method() {
    }
}

使用以下测试类:

public class Tester {
    @Mocked SimpleClass simple;

    @Test
    public void test() {
        new Expectations(SimpleUser.class) {
            {
                new SimpleClass();

                simple.method();

                SimpleUser.useSimple(simple);
            }
        };

        SimpleUser user = new SimpleUser();
        user.createAndUse();
    }
}

这个测试通过了。

但是,当我删除simple.method()中对SimpleUser的调用以及simple.method()中对Tester的期望时,测试错误为:

mockit.internal.MissingInvocation: Missing invocation of
  SimpleUser#useSimple(SimpleClass simple)
    with arguments: SimpleClass@45490852

我可以通过将期望从SimpleUser.useSimple(simple)更改为SimpleUser.useSimple((SimpleClass) any)来使测试的此修改版本通过,但我想断言传递的实例是正确的。


为什么行为会改变,具体取决于是否调用method()如何确保使用SimpleUser.useSimple()中创建的SimpleClass调用createAndUse()求助于在SimpleClass 中调用方法。

1 个答案:

答案 0 :(得分:1)

我无法解释

  

为什么行为会根据是否调用method()而改变

但是对于JMockit 1.14,行为始终是相同的:调用失败simple.method()是否被调用。

但是,您可以通过在期望块中添加一行来测试您想要的内容(使用JMockit 1.14测试):

public class Tester {
    @Mocked
    SimpleClass simple;

    @Test
    public void test() {
        new Expectations(SimpleUser.class) {
            {
                new SimpleClass();
                result = simple;   // <- here

                simple.method();

                SimpleUser.useSimple(simple);
            }
        };

        SimpleUser user = new SimpleUser();
        user.createAndUse();
    }
}

希望这有帮助...