运行 Arquillian 与 TestNG 在 NPE 中的结果

Running Arquillian with TestNG results in NPE

我正在尝试简单地翻译 Arquillian 示例 arquillian-persistence-tutorial into a TestNG test. I've replaced the according dependencies (junit:junit => org.testng:testng, org.jboss.arquillian.junit:arquillian-junit-container => org.jboss.arquillian.testng:arquillian-testng-container) and updated the source code (https://gist.github.com/thomas-mc-work/a296ac40caa402b5120a)。

当我 运行 测试时,我得到两个 NullPointerEception:第 108 行和第 98 行。这两个位置都标志着对注入 EntityManager 的第一次访问。此外,方法 arquillianBeforeTest 未按预期执行。也不是经典的 TestNG 风格 @BeforeMethod.

请使用 inContainer() 方法检查您的测试,看看您的测试是否在 server/container 中 运行。 http://jayshaughnessy.blogspot.com/2012/11/arquillian-and-testng.html

中有更多信息

解决方案是使用 TestNG @BeforeMethod@AfterMethod 中的注释。重要的区别在于 Arquillian 每次测试都会调用 TestNG 两次:一次在容器内,一次在容器外。在无法注入 EntityManager 的地方首先出现外部。所以你要问你是在里面还是在外面:

@ArquillianResource
protected InitialContext initialContext;

@PersistenceContext
protected EntityManager em;

protected boolean inContainer() {
    // If the injection is done we're running in the container.
    return (null != initialContext);
}

@BeforeMethod
protected void beforeMethod() {
    if(inContainer()) {
        // use the EntityManager
    }
}