【问题标题】:Integration tests with Arquillian WELD-001408: Unsatisfied dependencies for type XXXX with qualifiers @Default使用 Arquillian WELD-001408 进行集成测试:带有限定符 @Default 的 XXXX 类型的依赖关系不满足
【发布时间】:2019-08-05 12:07:42
【问题描述】:

我正在使用 Arquillian 创建我的第一个 EJB 测试,考虑到具有相同问题的帖子数量,我面临的问题似乎很常见。但在尝试了所有建议后,我一直无法找到解决方案。

我在 wildfly14 上运行它。

我的测试课:

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.*;
import org.junit.Test;
import org.junit.runner.RunWith;

import javax.inject.*;

@RunWith(Arquillian.class)
public class LicenseManagerTest {

@Deployment
public static WebArchive createDeployment() {
    WebArchive war = ShrinkWrap.create(WebArchive.class)
                    .addClasses(LicenseManager.class)
                    .addPackages(true, "package1", "package2");
    return war;
    }

@Inject
private LicenseManager licenseManager;

@Test
public void getAboutTest() {
    Assert.assertNotNull(licenseManager.getAbout().getText());
    }
}

EJB 管理器:

import javax.ejb.Remote;

@Remote
public interface LicenseManager {

AboutDTO getAbout();

}

BEAN 类:

@Stateless(name = "LicenseManagerEJB3")
@Remote(LicenseManager.class)
public class LicenseManagerBean implements LicenseManager{

@Override
public AboutDTO getAbout(){
    *My code goes here*
}

}

Arquillian.xml

<?xml version="1.0"?>
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://jboss.org/schema/arquillian"
        xsi:schemaLocation="http://jboss.org/schema/arquillian
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<defaultProtocol type="Servlet 3.0"/>
<container qualifier="widlfly-managed" default="true">
    <configuration>
        <property name="jbossHome">target/wildFly-14.0.1.Final</property>
        <!--<property name="managementAddress">127.0.0.1</property>-->
        <!-- Port offset allows running the tests while a WildFly server is already running -->
        <property name="javaVmArguments">-Djboss.socket.binding.port-offset=10000 -Xms512m -Xmx1024m -XX:MaxPermSize=512m --add-modules java.se</property>
        <property name="managementPort">19990</property>
        <property name="username">admin</property>
        <property name="password">admin</property>
    </configuration>
</container>

POM 文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>artifactName</artifactId>
<parent>
    <groupId>package1</groupId>
    <artifactId>artifactName</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../name1/pom.xml</relativePath>
</parent>
<properties>
    <version.arquillian>1.4.1.Final</version.arquillian>
    <version.wildfly>14.0.1.Final</version.wildfly>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>false</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- Project dependencies -->
    <dependency>
        <groupId>org.jboss.arquillian</groupId>
        <artifactId>arquillian-bom</artifactId>
        <version>${version.arquillian}</version>
        <scope>test</scope>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>${version.arquillian}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.core</groupId>
        <artifactId>arquillian-core-api</artifactId>
        <version>${version.arquillian}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.protocol</groupId>
        <artifactId>arquillian-protocol-servlet</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.wildfly</groupId>
        <artifactId>wildfly-arquillian-container-managed</artifactId>
        <version>8.2.1.Final</version>
        <exclusions>
            <exclusion>
                <groupId>sun.jdk</groupId>
                <artifactId>jconsole</artifactId>
            </exclusion>
        </exclusions>
        <scope>test</scope>
    </dependency>
</dependencies>

<profiles>
    <profile>
        <id>wildFlyManaged</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <testResources>
                <testResource>
                    <directory>src/test/resources</directory>
                </testResource>
            </testResources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>unpack</id>
                            <phase>process-test-classes</phase>
                            <goals>
                                <goal>unpack</goal>
                            </goals>
                            <configuration>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>org.wildfly</groupId>
                                        <artifactId>wildfly-dist</artifactId>
                                        <version>${version.wildfly}</version>
                                        <type>zip</type>
                                        <overWrite>false</overWrite>
                                        <outputDirectory>target</outputDirectory>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

在测试配置过程中,几个和我的混合依赖的EJB,启动没有问题,但是LicenseManagerEJB3没有,执行测试代码时出现以下错误:

原因:org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: 带有限定符 @Default 的 LicenseManager 类型的依赖关系不满足 在注入点 [BackedAnnotatedField] @Inject private package1.LicenseManagerTest.licenseManager 在 package1.LicenseManagerTest.licenseManager(LicenseManagerTest.java:0) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:83) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:70) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.manager.BeanManagerImpl.createInjectionTarget(BeanManagerImpl.java:1025) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.util.ForwardingBeanManager.createInjectionTarget(ForwardingBeanManager.java:204) 在 deployment.0d8da7a8-dc23-4657-ac07-40964685a2c1.war//org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:143) 在 deployment.0d8da7a8-dc23-4657-ac07-40964685a2c1.war//org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125) ... 142 更多 原因:org.jboss.weld.exceptions.DeploymentException: WELD-001408: 带有限定符@Default 的 LicenseManager 类型的依赖关系不满足 在注入点 [BackedAnnotatedField] @Inject private package1.LicenseManagerTest.licenseManager 在 package1.LicenseManagerTest.licenseManager(LicenseManagerTest.java:0) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.bootstrap.Validator.validateProducer(Validator.java:425) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.injection.producer.InjectionTargetService.validateProducer(InjectionTargetService.java:36) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.manager.InjectionTargetFactoryImpl.validate(InjectionTargetFactoryImpl.java:153) 在 org.jboss.weld.core@3.0.5.Final//org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:81) ... 147 更多

你知道我做错了什么吗?谢谢

【问题讨论】:

    标签: java ejb wildfly cdi jboss-arquillian


    【解决方案1】:

    我认为您在部署中缺少 beans.xml,因此 CDI 在存档中找不到任何 bean,因为未为存档启用 CDI。

    尝试通过以下方式将beans.xml 添加到您的部署中:

    archive.addAsResource("META-INF/beans.xml);
    

    【讨论】:

    • 感谢您的回答 Thomas,但如果我没有理解错误,因为 javaee7 不需要 beans.xml 文件,我什至尝试在 createDeployment 方法期间添加一个空 beans.xml。从我一直在执行的测试来看,它似乎与 Maven 依赖项有关。如果我将直接依赖项添加到找到注入类的项目中,CDI 图标会立即出现在我的 IntelliJ 上,但问题是我的项目既旧又巨大(100 多个不同的模块),如果我这样做,我会得到 maven循环...
    • 我认为你是对的,因为 CDI 1.2 或 2 你不再需要 beans.xml 但我认为发现模式然后被注释但你的 EJB 没有 CDI 注释。或者 EJB 不能正常工作。您是否尝试使用@EJB 注入它?而且它唯一的远程 EJB 可能需要@Local。对于类加载问题,尝试通过 Class.forName() 获取类以检查其是否可用。如果它不起作用,您可以在 github 上提供一个示例项目吗?
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2015-06-10
    • 2018-12-19
    • 2015-04-05
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多