【问题标题】:Testing reflection newInstance exception测试反射 newInstance 异常
【发布时间】:2016-05-02 12:37:33
【问题描述】:

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

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() throw InvocationTargetException(以及其他异常)?

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

【问题讨论】:

  • 我不明白你在问什么。你想如何测试它?自动?
  • @Seth 与单元测试

标签: java unit-testing reflection junit mockito


【解决方案1】:

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

classToTest = spy(new NetworkClient());

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

@间谍 私有 NetworkClient 类ToTest;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2021-04-24
      • 1970-01-01
      • 2018-04-15
      • 2016-07-22
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多