繁体   English   中英

JDO(数据核)单元测试在Eclipse中可以正常工作,但在Maven中失败

[英]JDO (datanucleus) unit tests works fine in Eclipse but fails with Maven

我有2个Maven项目,它们都共享一个公共的父项目(用于公共依赖项等)。 第一个(P1)是我保留业务模型的地方。 另一个(P2)是服务层,使用P1中的模型和持久性功能。

P1 pom:

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>common</artifactId>
    <version>1.0.0</version>
</parent>
<artifactId>P1</artifactId>
<version>0.0.1-SNAPSHOT</version>
...

P2 pom:

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>common</artifactId>
    <version>1.0.0</version>
</parent>
<artifactId>P2</artifactId>
<version>0.0.1-SNAPSHOT</version>

...

<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>P1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
...

当我在Eclipse中运行P1的单元测试(以Junit测试方式运行)或在终端中运行mvn clean测试时,它们都可以正常工作。 但是,当我运行P2的单元测试时,它们仅在Eclipse中运行(运行为Junit测试)。 使用Maven时,使用P1模型的P2中的测试失败。

我检查了类路径,仅有的两个区别是

  • 在Eclipse中,P1类的路径是P1目录中的目标文件夹。 在Maven中,路径是我的本地存储库(应该可以,因为P1已安装在该存储库中)

  • 在Eclipse中,类路径包含对Java开发工具JUnit运行时支持的引用

我已经确认P1 / target中的文件与.m2 /.../ P1.jar中的文件匹配-这包括META-INF / persistence.xml。

我在单元测试中得到的错误属于同一类:

javax.jdo.JDODataStoreException: Cannot set long parameter: value = 1 for column "JOINTABLE_A_B.B_ID" : Invalid argument in JDBC call: parameter index out of range: 1
    at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:546)
    at org.datanucleus.api.jdo.JDOTransaction.commit(JDOTransaction.java:171)
    at com.mycompany.dao.TransactionalWork.execute(TransactionalWork.java:19)
    at com.mycompany.dao.BasicDAO.save(BasicDAO.java:40)
    at com.mycompany.service.ServiceHandler.handle(ServiceHandler.java:28)
    at com.mycompany.service.ServiceHandler.handle(ServiceHandler.java:15)
    at com.mycompany.service.ServiceHandlerTest.handling(ServiceHandlerTest.java:50)
    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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    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 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
NestedThrowablesStackTrace:
java.sql.SQLException: Invalid argument in JDBC call: parameter index out of range: 1
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.outOfRangeArgument(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.checkSetParameterIndex(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setLong(Unknown Source)
    at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.setLong(DelegatingPreparedStatement.java:121)
    at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.setLong(DelegatingPreparedStatement.java:121)
    at org.datanucleus.store.rdbms.ParamLoggingPreparedStatement.setLong(ParamLoggingPreparedStatement.java:777)
    at org.datanucleus.store.rdbms.mapping.datastore.BigIntRDBMSMapping.setLong(BigIntRDBMSMapping.java:125)
    at org.datanucleus.store.rdbms.mapping.java.SingleFieldMapping.setLong(SingleFieldMapping.java:150)
    at org.datanucleus.store.rdbms.mapping.AppIDObjectIdFieldManager.storeLongField(AppIDObjectIdFieldManager.java:197)
    at org.datanucleus.state.AppIdObjectIdFieldConsumer.storeLongField(AppIdObjectIdFieldConsumer.java:72)
    at com.mycompany.model.Entity.dnCopyKeyFieldsFromObjectId(Entity.java)
    at org.datanucleus.api.jdo.JDOAdapter.copyKeyFieldsFromIdToObject(JDOAdapter.java:699)
    at org.datanucleus.store.rdbms.mapping.java.PersistableMapping.setObjectAsValue(PersistableMapping.java:648)
    at org.datanucleus.store.rdbms.mapping.java.PersistableMapping.setObject(PersistableMapping.java:323)
    at org.datanucleus.store.rdbms.mapping.java.PersistableMapping.setObject(PersistableMapping.java:302)
    at org.datanucleus.store.rdbms.scostore.JoinSetStore.iterator(JoinSetStore.java:906)
    at org.datanucleus.store.types.wrappers.backed.Set.loadFromStore(Set.java:320)
    at org.datanucleus.store.types.wrappers.backed.Set.iterator(Set.java:485)
    at org.datanucleus.store.fieldmanager.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:102)
    at org.datanucleus.store.fieldmanager.AbstractFetchDepthFieldManager.fetchObjectField(AbstractFetchDepthFieldManager.java:105)
    at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1590)
    at org.datanucleus.state.StateManagerImpl.replacingObjectField(StateManagerImpl.java:117)
    at com.mycompany.model.Profile.dnReplaceField(Profile.java)
    at com.mycompany.model.Entity.dnReplaceFields(Entity.java)
    at org.datanucleus.state.StateManagerImpl.replaceFields(StateManagerImpl.java:3131)
    at org.datanucleus.state.StateManagerImpl.replaceFields(StateManagerImpl.java:3158)
    at org.datanucleus.state.AbstractStateManager.loadFieldsInFetchPlan(AbstractStateManager.java:1096)
    at org.datanucleus.ExecutionContextImpl.performDetachAllOnTxnEndPreparation(ExecutionContextImpl.java:4460)
    at org.datanucleus.ExecutionContextImpl.preCommit(ExecutionContextImpl.java:4115)
    at org.datanucleus.ExecutionContextImpl.transactionPreCommit(ExecutionContextImpl.java:683)
    at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:388)
    at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:277)
    at org.datanucleus.api.jdo.JDOTransaction.commit(JDOTransaction.java:107)
    at com.mycompany.dao.TransactionalWork.execute(TransactionalWork.java:19)
    at com.mycompany.dao.BasicDAO.save(BasicDAO.java:40)
    at com.mycompany.service.ServiceHandler.handle(ServiceHandler.java:28)
    at com.mycompany.service.ServiceHandler.handle(ServiceHandler.java:15)
    at com.mycompany.service.ServiceHandlerTest.handling(ServiceHandlerTest.java:50)
    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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    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 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: org.hsqldb.HsqlException: Invalid argument in JDBC call: parameter index out of range: 1
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    ... 69 more

我将HyperSQL DB用于单元测试。

有没有人遇到这个问题并提出解决方案?

事实证明,由于我没有在persistence.xml中声明我的类,因此Datanucleus正在扫描类路径。 在运行P1时,这在Maven中效果很好,因为这些类不会隐藏在jar文件中。 但是,在P2中,即使jar文件位于类路径中,扫描也未能成功找到类。 在Eclipse中不是这种情况,因为对P1的引用被视为项目引用-因此不会将类放在jar文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM