Java 为什么在Arquillian测试中不调用@PostConstruct

Java 为什么在Arquillian测试中不调用@PostConstruct,java,jakarta-ee,cdi,jboss-arquillian,Java,Jakarta Ee,Cdi,Jboss Arquillian,因为@BeforeClass回调不适用于arquillian测试,所以我尝试在测试的@PostConstruct回调中初始化一些字段。部署中有一个beans.xml,我还尝试添加一个@Startup注释和一个无参数构造函数,但没有效果。虽然CDI正在工作,并且正在为测试的其他字段执行所有注入,但是没有调用@PostConstruct。我错过什么了吗 我正在使用JBoss 7.1.1.Final上的Arquillian 1.0.Final。 我不是在寻找解决方法-我可以在回调之前使用@。但这显然是

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

我正在使用JBoss 7.1.1.Final上的
Arquillian 1.0.Final
。 我不是在寻找解决方法-我可以在回调之前使用
@。但这显然是次优的,因为我需要对所有测试只初始化一次值。更重要的是,观察到的行为似乎与我对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");
    }
@RunWith(Arquillian.class)
公共类上传重置测试{
@部署
公共静态存档createTestArchive(){
回缩包装
.create(WebArchive.class,“uploadResetTest.war”)
.addPackages(true,“my.package”)
.addasWebInfoResource(EmptyAsset.INSTANCE,“beans.xml”);
}
Map谓词=new HashMap();
@注入
测井日志;
@施工后
施工后公共空间(){
日志信息(“施工后”);
//在这里,我正在尝试填充地图
predicates.put(“type”,UploadTypes.TALLY.toString());
}
@试验
public void testResetTallies()引发异常{
//这里的地图还是空的
predicates.get(“type”);
}

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


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

如果您在带注释的@Deployment方法中这样做会发生什么?Im不是reall你和阿奎兰相处得很好tho@AkselWillgert-有趣的事情-它也不起作用-我将地图设置为静态,并尝试用
@Deployment
方法填充它,但它仍然是空的。但是它在
@之前可以正常工作,所以它不是地图。谢谢你,Vinet。这确实解释了它。我将在qruillian论坛WRT global fixture上发布s