运行 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
}
}
我正在尝试简单地翻译 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
}
}