测试反射newInstance异常

时间:2016-05-02 12:37:34

标签: java unit-testing reflection junit mockito

我在这段代码中使用了一组非常有限的反射:

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(和另一个例外)?

我目前正在使用Mockito和Hamcrest为UT的其余部分。

2 个答案:

答案 0 :(得分:1)

在junit测试的某个地方,您正在创建NetworkClient类的实例。这应该在setUp()方法(junt 3)或@Before方法(junit 4)中。无论如何,将实例包装在spy()

classToTest = spy(new NetworkClient());

如果您使用NetworkClient默认构造函数,只需使用@Spy注释声明该字段,Mockito将为您创建间谍。

@Spy    私有NetworkClient classToTest;

请务必在@Before或setUp方法中调用MockitoAnnotations.initMocks(this);以使注释生效。

一旦classToTest字段是间谍,你可以嘲笑 getConstructors()类返回你的测试数组并让第一个构造函数抛出所需的异常。

答案 1 :(得分:1)

最简单的方法是创建一个静态嵌套类,在您的测试类中扩展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
);