gpt4 book ai didi

java - Arquillian 测试NG : @Before Annotations and CDI

转载 作者:行者123 更新时间:2023-11-30 03:40:54 25 4
gpt4 key购买 nike

我正在将 Arquillian 和 TestNG 与 CDI 结合使用。

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

有人可以解释一下为什么吗:

1) CDI bean 尚未注入(inject)到测试生命周期的 @BeforeXXX 带注释的方法部分中?
2) 在测试之前如何进行一些设置并访问 CDI bean?
3)在@Test注释中使用“dependency”属性是否正确?

非常感谢。

最佳答案

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

测试在两个不同的地方运行:- 在客户端:maven jvm- 在容器中:服务器jvm

在客户端,CDI bean 在 @BeforeMethod 中不可用,但当测试在容器中运行时它们将可用。基本上,如果我们需要在 before 方法中访问 CDI bean,我们只需要确保测试正在容器中运行。为了实现这一点,我创建了一个扩展 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");
}
}

最后,客户端中的测试看起来像是被忽略了,以反射(reflect)在容器中执行的测试的结果。

如果这是错误的,请有人纠正吗?

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

关于java - Arquillian 测试NG : @Before Annotations and CDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com