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

时间:2012-11-28 12:18:45

标签: java java-ee cdi jboss-arquillian

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

我在Arquillian 1.0.0.Final上使用JBoss 7.1.1.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");
    }

1 个答案:

答案 0 :(得分:3)

不会为Arquillian测试中使用的测试类实例调用

@PostConstruct。虽然Arquillian对测试类实例的注入点执行非上下文CDI注入,但它不负责构造实例本身(JUnit或TestNG执行此操作),也不构造由CDI容器管理的测试类实例或任何其他服务容器(这解释了忽略@PostConstruct的原因)。

因此,您最好使用@Before。你确实提出了一个好点,可能值得调查JUnit和TestNG运行程序是否提供挂钩,以便CDI或其他DI提供程序可以管理或挂钩测试实例生命周期。