【问题标题】:Java Weld CDI alternative FactoryJava Weld CDI 替代工厂
【发布时间】: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


【解决方案1】:

src/main/resourcessrc/test/resources 中的类是两个独立的 bean 部署档案 (BDA)。 beans.xml 描述符只影响当前的 BDA。

所以您的&lt;alternative&gt; 定义只会影响您的测试类,而不影响您的生产类。

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

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

【讨论】:

  • 如果我理解正确 - 这意味着您可以“永远”将替代类注入生产代码?这不是 CDI 的目标之一吗?但是,我无法实现使用替代品、专业或优先级的解决方案。我将工厂更改为生产者方法,并且从配置中读取所有设置 - 在运行单元测试时对其进行操作。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2016-02-14
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多