gpt4 book ai didi

Java Weld CDI 替代工厂

转载 作者:行者123 更新时间:2023-12-01 12:26:28 25 4
gpt4 key购买 nike

在我的生产代码中,我有一个工厂,应该在我的测试代码中模拟该工厂。我有一个两个工厂都实现的接口(interface):

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 中的类(class)和src/test/resources是两个独立的 bean 部署文件 (BDA)。一个beans.xml描述符只影响当前的BDA。

所以你的<alternative>定义仅影响您的测试类,但不会影响您的生产类。

如果您使用 CDI 1.1,您可以通过添加 @Priority 使您的替代方案全局化(即为应用程序中的所有 BDA 激活它)。注释。

在 CDI 1.0 上,您可以尝试使用 @Specializes而不是@Alternative覆盖您的默认 bean。

关于Java Weld CDI 替代工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26293292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com