如何使用JMockit检查特定的模拟实例?

时间:2014-04-04 12:14:21

标签: java jmockit

我想测试以下代码

BufferedReader reader = new BufferedReader(new FileReader(args[0]));

如果我写这样的测试,它可以正常工作

@Mocked FileReader fileReader;
@Mocked BufferedReader bufferedReader;

//...

new NonStrictExpectations() {{
  new FileReader("filename"); times = 1;
  new BufferedReader(withAny(fileReader)); times = 1;
}};

但是,此测试不确保将create FileReader传递给BufferedReader的ctor,只是传递 a FileReader。

我真正想要的是最后一行是

new BufferedReader(withSameInstance(fileReader)); times = 1;

不幸的是,这不起作用,因为JMockit抱怨BufferedReader的ctor永远不会被指定的参数调用...

我尝试在fileReader上使用@Captured,但这也不起作用......

1 个答案:

答案 0 :(得分:4)

在{JMockit 1.6中删除了@Capturing模拟字段获取new - 分配给它们的ed实例的能力,以简化API。

使用当前的API(JMockit 1.6& 1.7),您仍然可以通过以下两种方式之一实现所需的效果:

@Mocked FileReader fileReader;
@Mocked BufferedReader bufferedReader;
FileReader capturedReader;

@Test
public void mockIOClasses() throws Exception {
    new NonStrictExpectations() {{
        new FileReader("filename");
        result = new Delegate() {
            void captureIt(Invocation inv) {
                capturedReader = inv.getInvokedInstance();
            }
        };
        times = 1;

        new BufferedReader(with(new Delegate<Reader>() {
            void check(Reader in) { assertSame(capturedReader, in); }
        }));
        times = 1;
    }};

    new BufferedReader(new FileReader("filename"));
}

@Test
public void mockIOClasses2() throws Exception
{
    new NonStrictExpectations() {{
        new FileReader("filename");
        result = new Delegate() {
            void captureIt(Invocation inv) {
                capturedReader = inv.getInvokedInstance();
            }
        };
    }};

    new BufferedReader(new FileReader("filename"));

    new Verifications() {{
        FileReader r;
        new BufferedReader(r = withCapture());
        assertSame(capturedReader, r);
    }};
}

但是,我建议避免模仿JRE IO类。上面的两个测试都与实现细节紧密耦合。最好的方法是使用真实的文件;你应该可以在这里使用一个小的测试文件(在&#34; test&#34; source dir中),也许在测试本身中将它作为一个临时文件创建。

相关问题