Java Arquillian TestNG:@在注释和CDI之前

Java Arquillian TestNG:@在注释和CDI之前,java,testng,jboss-arquillian,Java,Testng,Jboss Arquillian,我将Arquillian和TestNG与CDI一起使用 在每次测试之前,我需要访问一些CDIBeans成员,以便在每次测试之前进行一些设置。但我注意到,在每个@Before注释中,CDIBean都没有被注入,但在@Test注释的方法中,它们是被注入的 有人能解释一下为什么: 1) CDI bean还没有注入测试生命周期的@BeforeXXX注释方法部分 2) 在测试之前,我如何设置和访问CDIBean? 3) 在@Test注释中使用“dependency”属性是否正确? 非常感谢。我想我已经理解

我将Arquillian和TestNG与CDI一起使用

在每次测试之前,我需要访问一些CDIBeans成员,以便在每次测试之前进行一些设置。但我注意到,在每个@Before注释中,CDIBean都没有被注入,但在@Test注释的方法中,它们是被注入的

有人能解释一下为什么:

1) CDI bean还没有注入测试生命周期的@BeforeXXX注释方法部分
2) 在测试之前,我如何设置和访问CDIBean?
3) 在@Test注释中使用“dependency”属性是否正确?


非常感谢。

我想我已经理解了这个问题

测试在两个不同的位置运行: -在客户机中:maven jvm -容器中:服务器jvm

在客户端,CDIBean在@BeforeMethod中不可用,但当测试在容器中运行时,它们将可用。基本上,如果我们需要在before方法中访问cdibean,我们只需要确保测试正在容器中运行。为了实现这一点,我创建了一个扩展Arquillian的类,并公开了一个实现这一点的方法

    public abstract class BaseArquillianTest extends Arquillian {
    @ArquillianResource
    protected InitialContext initialContext;

    @Deployment
    @OverProtocol("Servlet 3.0")
    public static WebArchive createDeployment() {
        WebArchive war = PackagingUtil.getWebArchiveForEJB();
        return war;
    }

    protected boolean inContainer() {
       // If the injection is done we're running in the container.
       return (null != initialContext);
    }
}

我们只需要在@BeforeMethod方法中执行此签入

@BeforeMethod(alwaysRun = true)
public void beforeMethod() throws Exception {
    System.out.println("********* Initing beforeMethod");
    if(inContainer()) {
        System.out.println("$$$$$$ I am in a container");
        Assert.assertNotNull(allRiskConfigurations);

    } else {
        System.out.println("$$$$$$ I am NOT in a container");
    }
}
最后,客户端中的测试看起来被忽略,以反映容器中执行的测试的结果

如果这是错误的,请有人纠正一下好吗

无论如何,谢谢大家。我希望这有帮助