java - 为什么我的 Interceptor 在 Weld SE 单元测试中失败?

标签 java jboss java-ee-6 weld-se

我有一个拦截器,当我在 Web 应用程序中使用它时,它似乎被 JBoss (EAP 6.4) 正确加载,但当我在焊接环境中使用相同的 beans.xml 时,它被拒绝。

package com.stackoverflow;

import javax.enterprise.context.Dependent;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;

@Interceptor
@BindingAnnotation
@Dependent
public class InterceptorTest {

    @AroundInvoke
    public Object crypto(InvocationContext invocationContext) throws Exception {
        return null;
    }
}

还有一个测试:

package com.stackoverflow;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.Before;
import org.junit.Test;

public class InterceptorTestTest {

    WeldContainer container;

    @Before
    public void setup(){
        Weld weld = new Weld();
        container = weld.initialize();
    }

    @Test
    public void crypto() throws Exception {

    }

}

当我运行测试时:

[main] INFO org.jboss.weld.Version - WELD-000900 1.1.28 (Final)
[main] INFO org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.

org.jboss.weld.exceptions.DeploymentException: WELD-001417 Enabled interceptor class <class>com.stackoverflow.InterceptorTest</class> in file:/Users/pstanden/IdeaProjects/crypto/test/target/test-classes/META-INF/beans.xml@7 is neither annotated @Interceptor nor registered through a portable extension

    at org.jboss.weld.bootstrap.Validator.validateEnabledInterceptorClasses(Validator.java:503)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:373)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379)
    at org.jboss.weld.bootstrap.api.helpers.ForwardingBootstrap.validateBeans(ForwardingBootstrap.java:85)

我无法真正弄清楚应该添加或删除什么,以及为什么 Weld org.jboss.weld.se:weld-se:1.1.28.Final 似乎对同一版本的焊接做了不同的事情JBoss?

编辑: 我的 beans.xml:

<?xml version="1.0" encoding="UTF-8"?>

<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://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    <interceptors>
        <class>com.stackoverflow.InterceptorTest</class>
    </interceptors>
</beans>

再次编辑我的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">

    <groupId>com.stackoverflow</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>test</artifactId>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se</artifactId>
            <version>1.1.28.Final</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.javaee</groupId>
            <artifactId>javaee</artifactId>
            <version>6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

最佳答案

好的,成功重现您的问题并了解您在做什么。根据记录,它对我有用,因为我将它作为主要方法运行,而不是作为测试。

这里的问题是,您使用的是普通 JUnit 并且您的类位于 src/test 中 - Weld 不会拾取它们,或者更确切地说,不会扫描它们并将它们识别为 bean/interceptors 等。因此,您的拦截器将不会被发现,并且 beans.xml 中的定义将无效,从而导致您看到的异常。这是 JUnit 的一个已知问题,因为它不足以测试 CDI。

要解决此问题,您可以将这些类放入 src/main 中,并且应该正确选取它们。但很可能,您迟早会遇到类似的问题。

要真正解决此问题,我建议您使用 Arquillian 作为框架和 Arquillian-container-Weld 编写测试。作为它运行的容器。请注意,这仍然是 SE(尽管 Arquillian 也用于 EE 测试)。它允许您创建一个测试存档并放入您认为有值(value)的任何内容,Weld 会将其全部拾取。

为了激励自己,您可以查看 Weld 测试套件,其中在 SE 测试中使用了相同的东西。这是link进行这样的测试。

关于java - 为什么我的 Interceptor 在 Weld SE 单元测试中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43910135/

相关文章:

c# - Java 和 C# 的终结器

java - apache ant 中的规则文件

java - 从独立客户端向 JBoss 7.1 中的 JMS 主题发送消息,未找到 ConnectionFactory

java - 无法保存用户: Cannot deserialize instance of `java.util.ArrayList<>` out of START_OBJECT token at [Source: (BufferedInputStream)

java - 一个包含文件可以调用另一个包含文件的函数吗?

java - 在 Spring Boot 2 中使用实体管理器时,没有类型 'javax.persistence.EntityManager' 的合格 bean

java - JSF 中的多个页面不调用支持 bean 更改器(mutator)

jsf-2 - 程序化 Java EE 6 登录 : how to catch the LoginException?

mysql - JPA/Hibernate/mySql 中没有持久化数据

java - JEE7中如何在JNDI树中指定EJB bean名称