因为@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");
}
答案 0 :(得分:3)
@PostConstruct
。虽然Arquillian对测试类实例的注入点执行非上下文CDI注入,但它不负责构造实例本身(JUnit或TestNG执行此操作),也不构造由CDI容器管理的测试类实例或任何其他服务容器(这解释了忽略@PostConstruct
的原因)。
因此,您最好使用@Before
。你确实提出了一个好点,可能值得调查JUnit和TestNG运行程序是否提供挂钩,以便CDI或其他DI提供程序可以管理或挂钩测试实例生命周期。