使用来自 src/test/META-INF/beans.xml 的替代生产商进行焊接
Weld using alternative producer from src/test/META-INF/beans.xml
我正在尝试使用 Weld SE 2.3。0.Final 通过在 src/test/resources/META-INF
中提供不同的 beans.xml
在测试期间交换注入依赖项的替代实现
它似乎总是使用 beans.xml
的主要版本,但我不确定为什么。
首先是支持类
Engine.java
public interface Engine
{
void start();
void stop();
}
默认Engine.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
的生产版本
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/beans_1_0.xsd">
</beans>
上面的代码当 App.java 中的 运行 应该打印(确实如此)
Cough cough vrummmmm
Phhhut clank
现在从测试代码我想使用 SportsEngine
实现。所以我有以下
运动Engine.java
@Vetoed
public class SportsEngine implements Engine
{
public void start()
{
System.out.println("Vrummm vrummm vrummmm!");
}
public void stop()
{
System.out.println("Prrrrrr clunk");
}
}
测试EngineProducer.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<Object> 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;
}
}
和beans.xml
的测试版在src/test/resources/META-INF
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>com.test.testing.TestEngineProducer</class>
</alternatives>
</beans>
当测试方法是运行时,它应该打印
Vrummm vrummm vrummmm!
Prrrrrr clunk
但它似乎使用 EngineProducer
而不是 TestEngineProducer
并打印输出两次
Cough cough vrummmmm
Phhhut clank
Cough cough vrummmmm
Phhhut clank
为什么不使用测试 beans.xml?
如果我将测试 beans.xml 中的 <alternatives>
部分放入主 beans.xml 中,那么它可以工作,但我不想交换 beans.xml 在 main/resources/META-INF 当我测试时
看来是Weld Se的bug。它仅在 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)时。不要忘记用生产 beans.xml.
替换测试 beans.xml
如果您正在开发网络应用程序。您可以在 WEB-INF 下创建产品 beans.xml。 beans.xml 的 2 版本存在,但只有 WEB-INF/beans。xml 被 WAS 使用。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<scan>
<exclude name="org.jboss.weld.**" />
<exclude name="com.your_package.EngineProducer" />
</scan>
<alternatives>
<class>com.test.testing.TestEngineProducer</class>
</alternatives>
</beans>
我正在尝试使用 Weld SE 2.3。0.Final 通过在 src/test/resources/META-INF
beans.xml
在测试期间交换注入依赖项的替代实现
它似乎总是使用 beans.xml
的主要版本,但我不确定为什么。
首先是支持类
Engine.java
public interface Engine
{
void start();
void stop();
}
默认Engine.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
的生产版本
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/beans_1_0.xsd">
</beans>
上面的代码当 App.java 中的 运行 应该打印(确实如此)
Cough cough vrummmmm
Phhhut clank
现在从测试代码我想使用 SportsEngine
实现。所以我有以下
运动Engine.java
@Vetoed
public class SportsEngine implements Engine
{
public void start()
{
System.out.println("Vrummm vrummm vrummmm!");
}
public void stop()
{
System.out.println("Prrrrrr clunk");
}
}
测试EngineProducer.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<Object> 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;
}
}
和beans.xml
的测试版在src/test/resources/META-INF
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>com.test.testing.TestEngineProducer</class>
</alternatives>
</beans>
当测试方法是运行时,它应该打印
Vrummm vrummm vrummmm!
Prrrrrr clunk
但它似乎使用 EngineProducer
而不是 TestEngineProducer
并打印输出两次
Cough cough vrummmmm
Phhhut clank
Cough cough vrummmmm
Phhhut clank
为什么不使用测试 beans.xml?
如果我将测试 beans.xml 中的 <alternatives>
部分放入主 beans.xml 中,那么它可以工作,但我不想交换 beans.xml 在 main/resources/META-INF 当我测试时
看来是Weld Se的bug。它仅在 src/main/resources/META-INF.
下使用 beans.xml 版本解决方案是在 CDI-SE src/main/resources/META-INF/beans.xml 下使用 beans.xml 进行测试,您可能还需要将
您可以有另一个生产 beans.xml 文件,当您将代码导出到部署包(jar、war、ear)时。不要忘记用生产 beans.xml.
替换测试 beans.xml如果您正在开发网络应用程序。您可以在 WEB-INF 下创建产品 beans.xml。 beans.xml 的 2 版本存在,但只有 WEB-INF/beans。xml 被 WAS 使用。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<scan>
<exclude name="org.jboss.weld.**" />
<exclude name="com.your_package.EngineProducer" />
</scan>
<alternatives>
<class>com.test.testing.TestEngineProducer</class>
</alternatives>
</beans>