Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟单例工厂的对象创建?_Java_Unit Testing_Powermock_Powermockito - Fatal编程技术网

Java 如何模拟单例工厂的对象创建?

Java 如何模拟单例工厂的对象创建?,java,unit-testing,powermock,powermockito,Java,Unit Testing,Powermock,Powermockito,我试图效仿的例子是: @PrepareForTest(X.class) public class XTest extends PowerMockTestCase { @Test public void test() { whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message")); X x =

我试图效仿的例子是:

@PrepareForTest(X.class)
public class XTest extends PowerMockTestCase {
        @Test
        public void test() {
                whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));

                X x = new X();
                x.y(); // y is the method doing "new MyClass()"

                ..
        }
}
我尝试进行单元测试的工厂类:

public final class LoadableBeanFactory implements ILoadableBeanFactory {
    private static final class Loader {
        private static final LoadableBeanFactory INSTANCE = new LoadableBeanFactory();
    }

    private LoadableBeanFactory() { }

    public static @Nonnull LoadableBeanFactory getInstance() {
        return Loader.INSTANCE;
    }

    public final @Nonnull <BeanT extends ILoadableBean> BeanT create(final Class<BeanT> beanClass) {

       final BeanT optionBean;

        try {

            final Constructor<BeanT> ctor = beanClass.getConstructor();
            optionBean = ctor.newInstance();
            return beanClass.cast(optionBean);
        } catch(Exception e) {
           throw new IllegalArgumentException("Could not instantiate an instance of " + beanClass);
        }
    }
}

你为什么要这么做

如果将工厂封装在抽象(一个单独的类)中,那么可以通过构造函数注入工厂并模拟其创建方法

public class BeanFactory {

public <BeanT extends ILoadableBean> BeanT create(final Class<BeanT> beanClass) {
return LoadableBeanFactory.getInstance().create(beanClass);
    }

}

然后你根本不需要PowerMock,你的设计真的很好。

这是因为工厂通过反射实例化了你的bean,很可能与类加载有关,但我不熟悉mockito/PowerMock的这些低级方面。如果您只是返回一个
新的LoadableBean()
,它就会工作。请注意,您可以使用
assertSame
检查参数是否引用相同的实例。这是一个很好的建议!我将重新调整我的代码库,以便在工厂中使用这种设计模式。
public class BeanFactory {

public <BeanT extends ILoadableBean> BeanT create(final Class<BeanT> beanClass) {
return LoadableBeanFactory.getInstance().create(beanClass);
    }

}
public class SomeClass {
private final BeanFactory beanFactory;

public SomeClass(BeanFactory beanFactory)  {
this.beanFactory= beanFactory;
}

public void doSth() {
beanFactory.create(...);
}

}