焊接使用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-INF
中beans.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-INF
的beans.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文件,并将代码导出到部署包(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