java - App Engine Cloud Endpoints 单元测试,Data Nucleus 问题,可能吗?

标签 java google-app-engine unit-testing datanucleus google-cloud-endpoints

我们已经使用 Google App Engine Cloud Endpoints 构建了一个基本的 RESTful API,并且我们希望对我们编写的一些代码进行单元测试,只是为了检查插入和更新是否执行我们期望的所有操作。

我调查了 Local Unit Testing documentation Google 提供的,并实现了它建议的所有内容,但在 EntityManager.close() 时仍然崩溃正在被调用。我已经添加了 4 个 .jar 文件并正在使用 LocalServiceTestHelper在我的测试文件中。

我希望有人能够阐明这个问题,我假设我需要做的就是更改 persistance.xml 中的值允许 DataNucleus 在本地单元测试中运行,或者可能是我缺少的 .jar 文件?

我希望有人能够提供帮助,我是 Google App Engine 的众多用户之一!我可以提供代码,但我真正要做的就是 EntityManager.persist(Obj); ... EntityManager.close();

与问题相关的控制台输出是:

Jan 17, 2014 12:08:04 PM org.datanucleus.transaction.Transaction rollback

SEVERE: Operation rollback failed on resource: com.google.appengine.datanucleus.DatastoreXAResource@556afa8, error code UNKNOWN and transaction: [DataNucleus Transaction, ID=Xid=, enlisted resources=[com.google.appengine.datanucleus.DatastoreXAResource@556afa8]]

指向数据核问题。堆栈跟踪

javax.persistence.PersistenceException: Illegal argument at org.datanucleus.api.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:298) at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:197) at com.multipie.snapture.HashtagEndpoint.insertHashtag(HashtagEndpoint.java:124) at com.multipie.snapture.tests.HashtagTest.testInsertHashtag(HashtagTest.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at junit.framework.TestCase.runTest(TestCase.java:176) at junit.framework.TestCase.runBare(TestCase.java:141) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at junit.framework.TestSuite.runTest(TestSuite.java:255) at junit.framework.TestSuite.run(TestSuite.java:250) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.IllegalArgumentException: transactions on multiple entity groups only allowed in High Replication applications at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:39) at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:76) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:94) at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71) at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32) at com.google.appengine.api.datastore.TransactionImpl.getHandle(TransactionImpl.java:97) at com.google.appengine.api.datastore.TransactionImpl.getId(TransactionImpl.java:190) at com.google.appengine.api.datastore.BaseDatastoreServiceImpl.localTxnToRemoteTxn(BaseDatastoreServiceImpl.java:130) at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.doBatchPut(AsyncDatastoreServiceImpl.java:532) at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.put(AsyncDatastoreServiceImpl.java:490) at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.put(AsyncDatastoreServiceImpl.java:444) at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:86) at com.google.appengine.datanucleus.WrappedDatastoreService.put(WrappedDatastoreService.java:112) at com.google.appengine.datanucleus.EntityUtils.putEntitiesIntoDatastore(EntityUtils.java:766) at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:314) at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218) at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381) at org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778) at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 21 more

最佳答案

好的,遇到了一个谷歌代码项目,它帮助了我 - datanucleus-appengine-test .

设置LocalServiceTestHelper时,您需要在LocalDatastoreServiceTestConfig上设置一些特殊参数。代码如下:

        // Create High-Replication-Datastore simulation
        LocalDatastoreServiceTestConfig config = new LocalDatastoreServiceTestConfig();
        config.setDefaultHighRepJobPolicyUnappliedJobPercentage(1); // Can't be <1 and still have
                                                                    // multi-XG txns
        config.setStoreDelayMs(0);
        helper = new LocalServiceTestHelper(config);
        helper.setUp();

关于java - App Engine Cloud Endpoints 单元测试,Data Nucleus 问题,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21185922/

相关文章:

java - 带 Eclipse 的 Google App Engine 上的 Scala

python - NDB 异步 API 和 get_or_insert_async

java - Mockito 返回 false

java - 我应该应用多少测试来测试双向链表?

java - 通过本地代码更改将 Java 应用程序部署到 Openshift v3

java - 扩展 JPanel 在添加到另一个 JPanel 时显示很小

java - 应用程序不断崩溃

python - Cron 在本地主机上工作,但在部署 App Engine 时不工作

unit-testing - 如何在 retryAnalyzer 后将 TestNG DefaultSuite 结果发送到 Maven Surefire 插件

java - 我是 Java 自动化测试的新手。我应该更喜欢哪个工具? JUnit 还是 TestNG?