2

Weld SE 2.3.0.Final を使用して、テスト中に注入された依存関係の代替実装を交換しようとしていますbeans.xmlsrc/test/resources/META-INF

ただし、常にメインバージョンを使用しているように見えますが、そのbeans.xml理由はわかりません。

まず、サポートクラスはこちら

エンジン.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");
    }

}

車.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.xmlsrc/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.xmlsrc/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、出力を 2 回出力します。

Cough cough vrummmmm
Phhhut clank
Cough cough vrummmmm
Phhhut clank

テストの beans.xml を使用しないのはなぜですか?

テストの beans.xml からセクションを配置<alternatives>してメインの beans.xml に配置すると機能しますが、テスト中に main/resources/META-INF の beans.xml を交換したくありません。

4

1 に答える 1

2

Weld Se のバグのようです。src/main/resources/META-INF の下にある beans.xml バージョンのみを使用します。

ソリューションは、テスト目的で CDI-SE src/main/resources/META-INF/beans.xml の下の beans.xml を使用しており、beans.xml にも < exclude> を追加する必要がある場合があります。

コードをデプロイ パッケージ (jar、war、ear) にエクスポートするときに、別の運用の beans.xml ファイルを持つことができます。テスト用の beans.xml を本番用の beans.xml に置き換えることを忘れないでください。

Web アプリを開発している場合。WEB-INF の下に本番用の beans.xml を作成できます。2 バージョンの beans.xml が存在しますが、WAS で使用されるのは WEB-INF/beans.xml だけです。

<?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>
于 2015-10-26T13:40:25.180 に答える