Testing 集成测试期间焊缝的不满意依赖性

Testing 集成测试期间焊缝的不满意依赖性,testing,integration-testing,cdi,weld,jboss-weld,Testing,Integration Testing,Cdi,Weld,Jboss Weld,我能够部署一个RESTEasy应用程序,它可以很好地与Weld一起工作(这意味着我的CDI可以工作),但是我在集成测试中遇到了一些问题。我得到这个错误: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default 测试时: @RunWith(WeldJUnit4Runner.class) pub

我能够部署一个RESTEasy应用程序,它可以很好地与Weld一起工作(这意味着我的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>
我使用
weld se
2.4.1.Final进行测试。
谢谢

编辑:

因此,Weld似乎只查看src/test/java(当我将某个服务复制到src/test/java时,它就工作了)。这是愚蠢的,我不会复制我所有的类来测试它们。。。如何告诉Weld从src/main/java检索类?

对不起,我没有解决方案,但只有一个小提示:如果您想对
BlockJUnit4ClassRunner
进行一些自定义,为什么不尝试扩展
org.jglue.cdiunit.CdiRunner
org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner
?或者至少看看他们的源代码


另外,我总是发现Weld的类路径扫描容易出错。并尽量避免它。

它应该会起作用,所以我在这里发布了我所做的

首先,我使用:

  • 月蚀
  • jdk7
我的项目树如下所示:

以下是我的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>
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下运行测试,一切都会正常工作。我不明白为什么它在你这方面不起作用。

所以我能够通过创建
src/main/resources/META-INF/beans.xml
来让它起作用,除了现有的
src/main/webapp/WEB-INF/beans.xml
src/test/resources/META-INF/beans.xml
意味着现在我在同一个项目中有3倍的文件我觉得这很傻,但我想这就是焊接世界的现状

谢谢大家抽出时间

编辑:

实际上,我只能使用
src/main/resources/META-INF/beans.xml
(我删除了
src/main/webapp/WEB-INF/beans.xml

可能是您应该找到一种方法来注册
SomeService
实现,就像Cdi单元对@AdditionnalClasses注释所做的那样。您确定在测试类路径上有
SomeService
的实现吗?如果这在测试之外有效,而不是在这里,这意味着您的测试框架在CDI中运行得不好-例如,可能看不到bean。根据我自己的经验,我建议您尝试使用Arquillian测试CDI/Weld。@G.Demecki
CDI单元
找到它,并在我部署它时工作。除了我已经做过的让Weld发现beans的工作之外,还有什么可以做的呢?@Siliarus我真的需要让它能够扩展BlockJUnit4ClassRunner,因为我需要一些定制…我希望我可以避免Weld而使用Spring;-)感谢您花时间编写这样一个详细的答案:-)我用您的代码从头开始创建了一个新项目,它很有效,顺便说一句,我认为您的代码中有一个错误,位于
import fr.pe.cdirunner.SomeService
而不是
导入org.jvi.cdirunner.SomeService法兰西?不管怎样,我想出来了,我会发布一个答案。谢谢。xml unter src/test/resources也为我解决了这个问题。我的SomeService位于不同的maven模块中,DeltaSpike似乎也需要每个引用模块中的所有配置。
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);
    }
}