Я пытаюсь использовать Weld SE 2.3.0.Final поменять альтернативные реализации введенном зависимости во время тестирования путем подачи другого beans.xml
в src/test/resources/META-INF
Weld с использованием альтернативного производителя от SRC/тест/META-INF/beans.xml
Хотя, похоже, используется основная версия beans.xml
, хотя я не уверен, почему.
Прежде всего здесь классы поддержки
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();
}
}
И серийная версия beans.xml
в src/main/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">
</beans>
выше кода при запуске из 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<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
Почему это не используется t он тестирует beans.xml?
Если я положил раздел <alternatives>
из тестового beans.xml и поместил его в основной файл beans.xml, тогда он будет работать, но я не хочу менять bean-компоненты.xml в main/resources/META-INF при тестировании
Боюсь, что это не сработало – PDStat
Просто попробуйте и дайте мне знать результат! – Loc
У меня есть тот же результат :( – PDStat