gpt4 book ai didi

java - 为什么在 Arquillian 测试中没有调用 @PostConstruct

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:46 25 4
gpt4 key购买 nike

因为 @BeforeClass 回调不适用于 arquillian 测试,我尝试在测试的 @PostConstruct 回调中初始化一些字段。部署中有一个 beans.xml,我也尝试添加一个 @Startup 注释和一个无参数构造函数,但没有效果。尽管 CDI 正在运行,并且正在为测试的其他字段执行所有注入(inject),但未调用 @PostConstruct。我错过了什么吗?

我在 JBoss 7.1.1.Final 上使用 Arquillian 1.0.0.Final。我不是在寻找解决方法 - 我可以使用 @Before 回调。但这显然不是最优的,因为我只需要为所有测试初始化​​一次值。更重要的是,观察到的行为似乎与我对 CDI 的理解相矛盾。

这是我的测试要点:

    @RunWith(Arquillian.class)
public class UploadResetterTest {

@Deployment
public static Archive<?> createTestArchive() {

return ShrinkWrap
.create(WebArchive.class, "uploadResetTest.war")
.addPackages(true, "my.package")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}

Map<String, String> predicates = new HashMap<String, String>();

@Inject
Logger log;

@PostConstruct
public void postConstruct() {
log.info("postconstruct");

// here I am trying to fill the map
predicates.put("type", UploadTypes.TALLY.toString());
}

@Test
public void testResetTallies() throws Exception {

// here the map is still empty
predicates.get("type");
}

最佳答案

@PostConstruct 不会为 Arquillian 测试中使用的测试类实例调用。虽然 Arquillian 对测试类实例的注入(inject)点执行非上下文 CDI 注入(inject),但它不负责构造实例本身(JUnit 或 TestNG 这样做),也不负责由 CDI 容器或 CDI 管理的测试类实例的构造任何其他服务容器(这解释了为什么 @PostConstruct 被忽略)。

因此,您最好的选择是使用 @Before。不过,您确实提出了一个很好的观点,可能值得研究 JUnit 和 TestNG 运行器是否提供 Hook ,以便 CDI 或其他 DI 提供程序可以管理或挂接到测试实例生命周期。

关于java - 为什么在 Arquillian 测试中没有调用 @PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604914/

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