繁体   English   中英

Java Weld CDI替代工厂

[英]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/resourcessrc/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM