[英]Java Weld CDI alternative Factory
在生产代码中,我有一个工厂,应该在测试代码中模拟该工厂。 我有两个工厂都实现的接口:
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(生产)时,它确实起作用。 但是我不想要那样,因为我正在将测试代码放入生产代码中。 我看过一些教程通过这种方法来做...我做错了什么?
src/main/resources
和src/test/resources
是两个单独的bean部署档案(BDA)。 beans.xml
描述符仅影响当前的BDA。
因此,您的<alternative>
定义仅影响您的测试类,而不影响您的生产类。
如果使用CDI 1.1,则可以通过添加@Priority
批注来使替代项成为全局(即为应用程序中的所有BDA激活它)。
在CDI 1.0上,您可以尝试使用@Specializes
而不是@Alternative
覆盖默认bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.