在集成测试期间对Weld的不满意依赖性

时间:2017-01-24 18:48:46

标签: testing integration-testing cdi weld jboss-weld

我能够部署一个与Weld一起运行良好的RESTEasy应用程序(意味着我的CDI正常工作)但是我的集成测试遇到了一些麻烦。我收到这个错误:

org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
测试时

@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {

    @Inject
    private SomeService service;

    @Test
    public void test() {
        System.out.println(service);
    }
}

我的日志中的最后一条消息是

DEBUG::WELD-000100: Weld initialized. Validating beans

src / test / resources / META-INF / beans.xml的内容:

<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">
</beans>

顺便说一句,我尝试了cdi-unit库并且它可以正常工作,但我需要使用我自己的WeldJUnit4Runner,这是当前的:

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {

    private final Weld weld;
    private final WeldContainer container;

    public WeldJUnit4Runner(Class<?> klass) throws InitializationError {
        super(klass);
        this.weld = new Weld();
        this.container = weld.initialize();
    }

    @Override
    protected Object createTest() throws Exception {
        return container.instance().select(getTestClass().getJavaClass()).get();
    }
}

我使用weld-se 2.4.1.Final进行测试 感谢。

编辑:
所以似乎Weld只关注src / test / java(当我将SomeService复制到src / test / java时)。这很愚蠢,我不打算复制我的所有类来测试它们......如何告诉Weld从src / main / java中检索类?

3 个答案:

答案 0 :(得分:1)

所以除了现有的src/main/resources/META-INF/beans.xmlsrc/main/webapp/WEB-INF/beans.xml之外,我还可以通过创建src/test/resources/META-INF/beans.xml来使其工作。现在,我在同一项目中拥有3倍完全相同的文件发现很傻,但我想这就是Weld世界的情况......

谢谢大家的时间。

编辑:
实际上,我只能使用src/main/resources/META-INF/beans.xml部署应用程序(我删除了src/main/webapp/WEB-INF/beans.xml

答案 1 :(得分:0)

抱歉,我没有解决方案,但只是一个小线索:如果您想对BlockJUnit4ClassRunner进行一些自定义 - 为什么不尝试扩展org.jglue.cdiunit.CdiRunner或{{ 1}?或者至少看看他们的源代码。

聚苯乙烯。我总能找到Weld的类路径扫描脆弱的&amp; amp;容易出错。尽量避免使用它。

答案 2 :(得分:0)

应该有效,所以我在这里发布了我的所作所为。

首先,我使用:

  • Eclipse Luna
  • JDK 7

我的项目树如下:

enter image description here

以下是我的pom依赖项:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-core</artifactId>
    <version>2.4.1.Final</version>
    <scope>test</scope>
</dependency>

SomeService界面:

package org.jvi.cdirunner;

public interface SomeService {

    void test();
}

SomeServiceImpl实施:

package org.jvi.cdirunner;   

public class SomeServiceImpl implements SomeService {

    @Override
    public void test() {
        // TODO Auto-generated method stub
    }

}

运行测试:

package org.jvi.cdirunner.test;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.jvi.cdirunner.SomeService;

@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {

    @Inject
    private SomeService service;

    @Test
    public void test() {
        System.out.println(service);
    }
}

如果我在Eclipse下运行测试,一切正常。我无法弄清楚为什么它不适合你。