【发布时间】:2014-10-10 06:34:19
【问题描述】:
在我的生产代码中,我有一个工厂,应该在我的测试代码中模拟这个工厂。 我有一个两个工厂都实现的接口:
public interface FtpTransferFactory {
FtpTransfer createFtpTransfer(String host, String machine);
}
生产代码:
@Default
public class FtpTransferFactoryImpl implements FtpTransferFactory {
public FtpTransferFactoryImpl() {
}
@Override
public FtpTransfer createFtpTransfer(final String host, final String machine) {
return new FtpTransfer(); // Some real ftp transfer object
}
}
测试代码:
@Alternative
public class FtpTransferFactoryTestImpl implements FtpTransferFactory {
@Override
public FtpTransfer createFtpTransfer(String host, String machine) {
return ...; // Some real ftp transfer object, with different settings (test env)
}
}
在位于 src/test/resources 的 beans.xml 中:
<alternatives>
<class>engine.FtpTransferFactoryTestImpl</class>
</alternatives>
我的实现类:
@Default
public class SomeClass
/** Ftp Factory */
@Default
@Inject
private FtpTransferFactory ftpFactory;
...
}
当我执行单元测试时,我的实现类仍然以生产工厂而不是测试工厂结束。但是,当我将 -element 放入我的 src/main/resources (生产)时,它确实有效。但我不希望这样,因为我将测试代码放入生产代码中。我已经看过几个教程通过这种方法来做......我做错了什么?
【问题讨论】:
-
为什么不使用 mockito 进行这种测试?
-
因为我只想用其他设置初始化我的“FtpTransfer”对象(测试时)。我想使用真实的对象,因为我不想模拟它。
-
您需要运行时信息(用户输入)来创建 FtpTranfer 实例还是主机和机器可配置?如果是后者,您可以摆脱工厂并使用生产者方法。
-
我认为为此使用替代方案没有意义。如果您正在阅读在此类中加载该配置信息并具有获取处理生产者方法的方法。
标签: java dependency-injection cdi jboss-weld weld