在我的生产代码中我有一个工厂,这个工厂应该在我的测试代码中进行模拟。 我有一个工厂实现的接口:
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(生产)时,它确实有效。但我不想要,因为我将测试代码放入生产代码中。我通过这种方法看过几个教程......我做错了什么?
答案 0 :(得分:2)
src/main/resources
和src/test/resources
中的类是两个单独的bean部署档案(BDA)。 beans.xml
描述符仅影响当前的BDA。
因此,您的<alternative>
定义仅影响您的测试类,但不会影响您的生产类。
如果您使用CDI 1.1,则可以通过添加@Priority
注释来使您的替代全局(即为应用程序中的所有BDA激活它)。
在CDI 1.0上,您可以尝试使用@Specializes
代替@Alternative
来覆盖默认bean。