我想测试以下代码
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,但这也不起作用......
答案 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中),也许在测试本身中将它作为一个临时文件创建。