Mockito单元测试:工厂创建newInstance

时间:2017-05-16 12:43:58

标签: unit-testing mockito factory

对于单元测试,我想测试好的和坏的场景

我在Factory.createFoo()方法上遇到了一些问题。 我如何为此编写适当的单元测试(使用Mockito)

public class Bar extends Foo {
    public Bar() {}
    public Bar(Scenario scenario){
       ...DoStuff..
    }
}

public static <T extends Foo> T createFoo(Class<T> fooClass) throws RuntimeException {
    try {
        return fooClass.newInstance();
    } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
        throw new RuntimeException("Could not create the Foo: " + fooClass.getSimpleName(), e);
    }
}

public static <T extends Foo> T createFoo(Scenario scenario, Class<T> fooClass) throws RuntimeException {
    try {
        return fooClass.getDeclaredConstructor(Scenario.class).newInstance(scenario);
    } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
        throw new RuntimeException("Could not create the needed Foo: " + fooClass.getSimpleName(), e);
    }
}

我希望能够模拟以下部分:

fooClass.newInstance();

fooClass.getDeclaredConstructor(Scenario.class).newInstance(scenario);

我找到了一些工厂示例,但都没有通用的

Class<T>

让这些例子对我无效。

如何继续测试这些工厂方法? 如果有一个设计缺陷使这个不可测试,请不要犹豫,指出我的缺点; - )

1 个答案:

答案 0 :(得分:0)

而不是嘲笑,用真实的类设置测试会不会更容易导致抛出所需的异常?

示例:要获得InstantiationException,您可以传入一个抽象类(在测试中定义为嵌套类)并获得IllegalAccessException,您可以在一个私有的类中发送 - args构造函数。然后测试是否抛出了RuntimeException