【问题标题】:Embedded Cassandra unit test with JUnit4.12 + Gradle4.9 running into NoSuchFileException嵌入式 Cassandra 单元测试,JUnit4.12 + Gradle4.9 运行到 NoSuchFileException
【发布时间】:2019-04-23 02:32:50
【问题描述】:

我有一个将嵌入式 cassandra 初始化为的测试

EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.CASSANDRA_RNDPORT_YML_FILE, <timeout>)

初始化时在 Gradle 中抛出以下堆栈跟踪

19:16:46.043 [DEBUG] [TestEventLogger]     FSWriteError in target/embeddedCassandra/hints
19:16:46.043 [DEBUG] [TestEventLogger]         at org.apache.cassandra.io.util.FileUtils.deleteWithConfirm(FileUtils.java:137)
19:16:46.043 [DEBUG] [TestEventLogger]         at org.apache.cassandra.io.util.FileUtils.deleteWithConfirm(FileUtils.java:154)
19:16:46.043 [DEBUG] [TestEventLogger]         at org.apache.cassandra.io.util.FileUtils.deleteRecursive(FileUtils.java:443)
19:16:46.043 [DEBUG] [TestEventLogger]         at org.apache.cassandra.io.util.FileUtils.deleteRecursive(FileUtils.java:439)
19:16:46.043 [DEBUG] [TestEventLogger]         at org.cassandraunit.utils.EmbeddedCassandraServerHelper.rmdir(EmbeddedCassandraServerHelper.java:282)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.cassandraunit.utils.EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.java:87)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.cassandraunit.utils.EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.java:70)
19:16:46.044 [DEBUG] [TestEventLogger]         at com.testapp.communicator.common.CassandraSampleStoreTest.<init>(CassandraSampleStoreTest.java:61)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
19:16:46.044 [DEBUG] [TestEventLogger]         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
19:16:46.044 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
19:16:46.044 [DEBUG] [TestEventLogger]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
19:16:46.045 [DEBUG] [TestEventLogger]         at java.lang.reflect.Method.invoke(Method.java:498)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
19:16:46.045 [DEBUG] [TestEventLogger]         at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
19:16:46.045 [DEBUG] [TestEventLogger]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19:16:46.045 [DEBUG] [TestEventLogger]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
19:16:46.045 [DEBUG] [TestEventLogger]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
19:16:46.045 [DEBUG] [TestEventLogger]         at java.lang.reflect.Method.invoke(Method.java:498)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
19:16:46.045 [DEBUG] [TestEventLogger]         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
19:16:46.045 [DEBUG] [TestEventLogger]         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
19:16:46.045 [DEBUG] [TestEventLogger]         at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
19:16:46.045 [DEBUG] [TestEventLogger]         at java.lang.Thread.run(Thread.java:748)
19:16:46.045 [DEBUG] [TestEventLogger]
19:16:46.045 [DEBUG] [TestEventLogger]         Caused by:
19:16:46.045 [DEBUG] [TestEventLogger]         java.nio.file.NoSuchFileException: target/embeddedCassandra/hints
19:16:46.045 [DEBUG] [TestEventLogger]             at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
19:16:46.045 [DEBUG] [TestEventLogger]             at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
19:16:46.045 [DEBUG] [TestEventLogger]             at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
19:16:46.046 [DEBUG] [TestEventLogger]             at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
19:16:46.046 [DEBUG] [TestEventLogger]             at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
19:16:46.046 [DEBUG] [TestEventLogger]             at java.nio.file.Files.delete(Files.java:1126)
19:16:46.046 [DEBUG] [TestEventLogger]             at org.apache.cassandra.io.util.FileUtils.deleteWithConfirm(FileUtils.java:131)
19:16:46.046 [DEBUG] [TestEventLogger]             ... 53 more

上面清楚地表明它正在发生,因为它无法在它正在寻找的地方找到它正在寻找的资源。但是我已经尝试在这里实现其他解决方案,例如将资源复制到${buildDir}/classes 或设置源集等。此问题仅限于 gradle build,并且在使用 maven 测试运行时不是问题。

由于 target/embeddedCassandra/hints 是从 EmbeddedCassandraServerHelper 代码中获取的,因此我无法将其更改为使用 getClassLoader() 在类加载器的上下文中获取,从而使资源复制到 build/classes 文件夹本来就无用。

非常感谢您的建议。

【问题讨论】:

  • 能否指点示例源代码重现?

标签: gradle junit cassandra


【解决方案1】:

作为替代方案,我可以向您推荐https://github.com/nosan/embedded-cassandra 项目

【讨论】:

  • 一种对另一种的优缺点是什么?你能提供一些你建议的方法的细节吗?
  • 支持不同版本和多种平台(Windows、Linux 和 OSX)。 Spring Boot、TestNG、JUnit4、JUnit5 的扩展。没有 jar-hell(只有 2 个编译依赖项 org.apache.commons:commons-compress:1.18, org.slf4j:slf4j-api:1.7.26)同时支持 java 驱动程序(com.datastax.cassandra:cassandra-driver-core 和com.datastax.oss:java-driver-core) 适用于 gradle 和 maven。此外,如果您使用的是 spring-data-cassandra,则有一个切片 @DataCassandraTest (github.com/nosan/cassandra-test-spring-boot) 可以帮助您针对 Cassandra 编写测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多