焊接使用src / test / META-INF / beans.xml中的替代生产者

我试图通过在src/test/resources/META-INF提供不同的beans.xml来使用Weld SE 2.3.0.Final在测试期间交换注入依赖项的替代实现

它总是似乎使用beans.xml的主要版本,我不知道为什么。

首先,这里是支持class

Engine.java

 public interface Engine { void start(); void stop(); } 

DefaultEngine.java

 @Vetoed public class DefaultEngine implements Engine { public void start() { System.out.println("Cough cough vrummmmm"); } public void stop() { System.out.println("Phhhut clank"); } } 

Car.java

 public class Car { @Inject private Engine engine; public void startCar() { engine.start(); } public void stopCar() { engine.stop(); } } 

EngineProducer.java

 public class EngineProducer { @Produces public Engine getEngine() { return new DefaultEngine(); } } 

App.java

 public class App { @Inject private Car car; public void main(@Observes ContainerInitialized event) { car.startCar(); car.stopCar(); } } 

以及src/main/resources/META-INFbeans.xml的生产版本

   

从App.java运行时上面的代码应该打印(它确实)

 Cough cough vrummmmm Phhhut clank 

现在从测试代码我想使用SportsEngine实现。 所以我有以下内容

SportsEngine.java

 @Vetoed public class SportsEngine implements Engine { public void start() { System.out.println("Vrummm vrummm vrummmm!"); } public void stop() { System.out.println("Prrrrrr clunk"); } } 

TestEngineProducer.java

 @Alternative public class TestEngineProducer { @Produces public Engine getEngine() { return new SportsEngine(); } } 

AppTest.java

 @RunWith(WeldJUnit4Runner.class) public class AppTest { @Inject private Car car; @Test public void testCar() { car.startCar(); car.stopCar(); } } 

WeldJUnit4Runner.java

 public class WeldJUnit4Runner extends BlockJUnit4ClassRunner { /** The test class to run. */ private final Class mKlass; /** Weld infrastructure. */ private final Weld weld; /** The container itself. */ private final WeldContainer container; /** * Runs the class passed as a parameter within the container. * * @param klass * to run * @throws InitializationError * if anything goes wrong. */ public WeldJUnit4Runner(final Class klass) throws InitializationError { super(klass); this.mKlass = klass; this.weld = new Weld(); this.container = weld.initialize(); } @Override protected Object createTest() throws Exception { final Object test = container.instance().select(mKlass).get(); return test; } } 

以及src/test/resources/META-INFbeans.xml测试版

   com.test.testing.TestEngineProducer   

当测试方法运行时,它应该打印

 Vrummm vrummm vrummmm! Prrrrrr clunk 

但它似乎使用EngineProducer而不是TestEngineProducer并打印输出两次

 Cough cough vrummmmm Phhhut clank Cough cough vrummmmm Phhhut clank 

为什么不使用test beans.xml?

如果我从test beans.xml中放入部分并将其放在main beans.xml中,那么它可以正常工作,但我不想在main / resources / META-INF中交换beans.xml测试

这似乎是Weld Se的一个错误。 它只使用src / main / resources / META-INF下的beans.xml版本。

解决方案是使用CDI-SE src / main / resources / META-INF / beans.xml下的beans.xml进行测试,您可能还需要将添加到beans.xml中。

您可以拥有另一个生产beans.xml文件,并将代码导出到部署包(jar,war,ear)。 不要忘记使用production beans.xml替换测试beans.xml。

如果您正在开发Web应用程序。 您可以在WEB-INF下创建生产beans.xml。 存在beans.xml的2个版本,但WAS仅使用WEB-INF / beans.xml。

        com.test.testing.TestEngineProducer