我在这段代码中使用了一组非常有限的反射:
public NetworkClient createNetworkClient() {
try {
return (NetworkClient) getNetworkClientClass().getConstructors()[0].newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
如何测试(使用单元测试)newInstance()
抛出InvocationTargetException
(以及其他异常)?
我目前在UT的其余部分使用Mockito和Hamcrest。
在junit测试的某个地方,您正在创建NetworkClient
类的实例。这应该在setUp()方法(junt3)或@Before方法(junt4)中。无论在哪里,都要将实例包装在spy()中
classToTest = spy(new NetworkClient());
如果您使用NetworkClient
默认构造函数,只需使用@Spy注释声明字段,Mockito就会将其创建为间谍。
@间谍private NetworkClient classToTest;
请确保在@Before或setUp方法中调用MockitoAnnotations.initMocks(this);
以使注释工作。
一旦classToTest
字段是间谍,您就可以模拟getConstructors()
类返回测试数组,并让第一个构造函数抛出所需的异常。
最简单的方法是在测试类中创建一个扩展NetworkClient
的静态嵌套类,该类将在其构造函数中抛出一个Exception
,如下所示:
public class MyTest {
public static class MyFailingNetworkClient extends NetworkClient {
public MyFailingNetworkClient() {
throw new RuntimeException("Cannot create this object");
}
}
...
}
然后在您的测试用例中,您可以使用Mokito使getNetworkClientClass()
返回MyFailingNetworkClient.class
(假设它不能用简单的setter完成),如下所示:
MyObject object = spy(new MyObject());
when(object.getNetworkClientClass()).thenReturn(
MyFailingNetworkClient.class
);