java - Arquillian 测试的回滚事务 - 获取 NullPointerException

标签 java jboss7.x testng jboss-arquillian

描述

我在创建一个在执行结束时回滚数据库操作的 Arquillian 测试时遇到了问题。 它在尝试回滚事务时抛出一个 NullPointerException,因为它无法从 org 中找到 org.jboss.arquillian.test.spi.TestResult 实例。 jboss.arquillian.test.impl.context.TestContextImpl 实例(testResultInstance.get() 返回 null,如下)。

我正在使用 arquillian-1.1.2-Final 和 arquillian-transaction-api-1.0.0-FINAL 以及 testng-6.8。

我可以在测试方法的开头看到正确创建的事务,但我无法弄清楚为什么 org.jboss.arquillian.test.spi.TestResult 设置不正确并且抛出异常。

注意:如果我从测试类中删除 @Transactional 注释,一切正常。此外,在此测试中,您将看到没有更新/插入数据库,但这只是为了简单起见。如果我向它添加更新语句,记录会正确更新,但更改会在测试结束后保留​​(如果我从测试类中删除 @Transactional 注释),我想通过以下方式防止这种情况发生回滚...

信息

发生异常的代码(下面方法的第一行 - 来自 org.jboss.arquillian.transaction.impl.lifecycle.TransactionHandler):

/**
 * Returns whether the test requires to be rolled back. </p>
 * By default it will return true if the last executed test has failed.
 *
 * @return true if test requires rollback, false otherwise
 */
private boolean testRequiresRollbackDueToFailure()
{
   final Status actualStatus = testResultInstance.get().getStatus();
   return TestResult.Status.FAILED.equals(actualStatus);
}

异常堆栈跟踪:

java.lang.NullPointerException
    at org.jboss.arquillian.transaction.impl.lifecycle.TransactionHandler.testRequiresRollbackDueToFailure(TransactionHandler.java:159)
    at org.jboss.arquillian.transaction.impl.lifecycle.TransactionHandler.rollbackRequired(TransactionHandler.java:148)
    at org.jboss.arquillian.transaction.impl.lifecycle.TransactionHandler.endTransactionAfterTest(TransactionHandler.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
    at org.jboss.arquillian.testenricher.cdi.CreationalContextDestroyer.destory(CreationalContextDestroyer.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
    at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:102)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
    at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
    at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)
    at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.after(EventTestRunnerAdaptor.java:103)
    at org.jboss.arquillian.testng.Arquillian.arquillianAfterTest(Arquillian.java:149)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:786)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.jboss.arquillian.testng.container.TestNGTestRunner.execute(TestNGTestRunner.java:53)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:160)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:126)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:90)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Thread.java:619)

测试类:

package ie.one23.insurance.common.dao.config;

import ie.one23.insurance.motor.dao.lookup.LookupDao;
import ie.one23.insurance.motor.util.PackagingUtil;

import javax.inject.Inject;

import org.apache.poi.hssf.record.formula.functions.Lookup;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.testng.Arquillian;
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
import org.jboss.arquillian.transaction.api.annotation.Transactional;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.testng.annotations.Test;

@Transactional(TransactionMode.ROLLBACK)
public class TermsOfBusinessUrlDaoTest extends Arquillian {

    @Deployment
    @OverProtocol("Servlet 3.0")
    public static WebArchive createDeployment() {
        WebArchive war = PackagingUtil.getWebArchiveForEJB();
        return war;
    }

    @Inject
    LookupDao lookupDao;

    @Test(groups = { "daos", "integration", "arquillian" })
    public void testFindValidLinkByCode() {
        Lookup lookup = lookupDao.findValidLinkByCode("example");

        Assert.assertNotNull(lookup);
        Assert.assertEquals("example", lookup.getCode());
        Assert.assertEquals(true, lookup.getActive());
    }
}

arquillian.xml

<arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://jboss.org/schema/arquillian
        http://jboss.org/schema/arquillian/arquillian_1_0.xsd">

    <container qualifier="jboss-remote" default="false">
        <configuration>
            <property name="managementAddress">${mgmtAddr:127.0.0.1}</property>
            <property name="managementPort">${mgmtPort:9999}</property>
        </configuration>
    </container>

    <extension qualifier="transaction">
        <property name="manager">java:jboss/TransactionManager</property>
    </extension>

    <extension qualifier="persistence">
        <property name="defaultTransactionMode">ROLLBACK</property>
    </extension>

</arquillian>

作为 arquillian-extension-transaction 一部分的单元测试在调用测试方法之前显示了 TestResult 的绑定(bind):

如果我删除绑定(bind)指令,我会得到同样的异常......这个绑定(bind)是否正确?

请参阅以下网址:https://github.com/arquillian/arquillian-extension-transaction/blob/master/impl-base/src/test/java/org/jboss/arquillian/transaction/impl/lifecycle/ClientSideTransactionHandlerTestCase.java

@Test
public void shouldRollbackTransaction() throws Exception
{

  getManager().getContext(ClassContext.class).activate(TestClass.class);

  Object instance = new TestClass();
  Method testMethod = instance.getClass().getMethod("rollbackTest");

  bind(TestScoped.class, TestResult.class, new TestResult(TestResult.Status.PASSED));

  getManager().fire(new org.jboss.arquillian.test.spi.event.suite.After(instance, testMethod));

  // checks if the transaction context has been disposed
  verify(mockTransactionContext).destroy();

  // verifies that the transaction has been rollback
  verify(mockTransactionProvider).rollbackTransaction(any(TransactionalTest.class));

  getManager().getContext(ClassContext.class).deactivate();

最佳答案

有点晚了,但我遇到了同样的问题并且能够解决它。

问题是 Arquillian 核心版本和 Arquillian 持久性不匹配。

对于 Arquillian Persistence 版本 1.0.0.Alpha7,当使用 Arquillian Core 1.1.5.Final 运行时,会出现此错误。

如果 Arquillian Core 版本更改为 1.1.2.Final,错误就会消失...:-D

关于java - Arquillian 测试的回滚事务 - 获取 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662548/

相关文章:

java - 不关闭 InputStreamReader 的负面影响是什么

jboss - ClassNotFoundException 引用 JBoss AS 7 中的 hornetq 特定内容

java - 问题 : failed to create task or type testng. 原因:名称未定义

java - 如何通过(Maven、TestNG、Java)获取运行时值

java - TestNG、Jenkins、集成测试 RESTful API : how to specify the Base URL?

java - 内存中的图像消耗的内存远多于其文件大小

java - 在 hibernate 状态下可连接多对多

java - 停止已经运行的线程

java - 在 jBoss 日志中显示/隐藏 SQL 查询

java - RestEASY 和 Jackson 不兼容 - NoSuchMethodException