Java Weld CDI替代工厂

时间:2014-10-10 06:34:20

标签: java dependency-injection cdi jboss-weld weld

在我的生产代码中我有一个工厂,这个工厂应该在我的测试代码中进行模拟。 我有一个工厂实现的接口:

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(生产)时,它确实有效。但我不想要,因为我将测试代码放入生产代码中。我通过这种方法看过几个教程......我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

在CDI 1.0上,您可以尝试使用@Specializes代替@Alternative来覆盖默认bean。