我正在测试一个服务类A,它正在从B类加载数据。他们的设置如下:
public class A {
private B b;
public A (B b)
this.b = b;
}
public String getInfo() throws IOException {
return b.getData()
}
}
public class B {
public String getData() throws IOException {
//gets data from the internet
//throws IOException if it can't connect to the internet
}
}
所以基本上我决定在我的setUp方法
中模仿它private static A a;
@BeforeClass
public static void setUp() {
B b = mock(B.class);
when(b.getData()).then(invocation -> {
try {
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
} catch (IOException ex) {
throw new IOException(ex);
}
//some other operations follow after this, but they all work
return "...";
});
this.a = new A(b);
}
测试调用A的getInfo()方法。每当我断开我的路由器(并在之后运行测试)时,它应该抛出一个异常(当我在模拟之外尝试它时,无论如何)。但是,在模拟时,它永远不会进入异常块 - 它只是传递openConnection()调用,就像没有问题一样。为什么会这样?
答案 0 :(得分:0)
嗯,是的,但是如果没有联系,B应该抛出异常。所以基本上没有办法用Mockito做到这一点?
有可能:
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Rule
public ExpectedException exception = ExpectedException.none();
@Mock B b;
@Test
public void getInfo_ExceptionThrownByB_ExceptionFallsThrough(){
// prepare
doThrow(new IOException("unitTest"))when(b).getData();
A a = new A(b);
// assert (before act because exceptions are special)
exception.expect(IOException.class);
exception.expectMessage("unitTest");
// act
a.getInfo();
}
我认为重点是:(你自己)清楚你测试的是什么。你测试的任何东西(可能是,但通常不超过一个类)不应该被嘲笑。您在测试下编码的任何内容都应与交互进行模拟(除非该依赖是像DTO一样简单破坏,或者不太可能像JRE类那样改变,例如:集合)。