如何在Play框架应用中编写junit测试用例

问题描述 投票:2回答:1

我对Play框架和Couchbase并不熟悉,我正在尝试为我的Play框架应用程序编写一个基本的Junit测试用例,但这给了我NoSuchMethodError:com.couchbase.client.java.env.DefaultCouchbaseEnvironment。我在测试用例中没有在任何地方引用CouchbaseEnvironment,那么为什么会出现此错误?我正在使用sbt test命令通过控制台执行测试用例。

import org.junit.Test;
import play.test.WithApplication;
import static org.junit.Assert.assertEquals;

public class AppControllerTest extends WithApplication {
    @Test
    public void testMethod() {

        boolean t = true;
        assertEquals(true, t);
    }
}

build.sbt内容在下面

import com.confidential.api.platform.sbt.apibuild.plugins.ServiceProjectPlugin
import com.confidential.api.platform.sbt.apibuild.settings.APIDependencies._

name := "ProductService"
organization := "confidential"

version := "1.0"

scalaVersion := "2.12.4"

enablePlugins(PlayMinimalJava, ServiceProjectPlugin, PlayMessagesPlugin)

val playHealthCheckModuleVersion = "1.0"
val playLoggingModuleVersion = "1.0.1"
val playDBCouchbaseModuleVersion = "1.0"
val playi18nModuleVersion = "1.0"
val playGoogleMapsClientVersion = "1.0.2"
val playErrorHandlingModuleVersion = "1.1.2"
val playTestCucumberModuleVersion = "1.2.2-SNAPSHOT"

libraryDependencies += "javax.validation" % "validation-api" % "1.1.0.Final"
libraryDependencies += "org.hibernate" % "hibernate-validator" % "5.2.5.Final"
libraryDependencies += "javax.el" % "javax.el-api" % "2.2.4"
libraryDependencies += "com.couchbase.client" % "java-client" % "2.7.7"

libraryDependencies ++= Seq(
  javaWs,
  guice,

  Base.logback,
  Base.apacheCommonLang,
  Base.jacksonDatabind,
  Base.vavr,
  Base.apacheCommonCollections,
  Base.guavaCollections,
  Base.cuidJava,

  "com.confidential.api.platform" %% "play-healthcheck" % playHealthCheckModuleVersion,
  "com.confidential.api.platform" %% "play-logging" % playLoggingModuleVersion,
  "com.confidential.api.platform" %% "play-i18n" % playi18nModuleVersion,
  "com.confidential.api.platform" %% "play-errorhandling" % playErrorHandlingModuleVersion,
  "com.confidential.api.platform" %% "play-rest" % "1.0.4",
  "com.confidential.api.platform" %% "play-test-cucumber" % playTestCucumberModuleVersion % Test,

  OASSupport.swaggerAnnotations,


  "com.googlecode.json-simple" % "json-simple" % "1.1",
  //testing dependency
  "junit" % "junit" % "4.12" % Test,
  "org.mockito" % "mockito-core" % "2.17.0" % Test, 
  TestSupport.couchbaseMock

) ++ TestSupport.junitAndCucumber ++ TestSupport.testTools


i18nFetchSourceMessageTaxonomyCategoryNames := Seq("APICLIENTERRORCODE_v2", "API_Platform_Error_Codes_v2")
i18nMessagesSourceSystemCookies := Some(Map("MI_SITE" -> "gatewayprod3"))
i18nFilteredInBundleMessageIds := Seq(
  "500",
  "400",
  "404"
)

Stacktrace

[error] Test com.confidential.controllers.PctControllerTest.testMethod failed: com.google.inject.CreationException: Unable to create injector, see the following errors:
[error]
[error] 1) Error injecting constructor, java.lang.NoSuchMethodError: com.couchbase.client.java.env.DefaultCouchbaseEnvironment$Builder.autoreleaseAfter(J)Lcom/couchbase/client/java/env/DefaultCouchbaseEnvironment$Builder;
[error]   at com.confidential.api.platform.play.db.couchbase.CouchbaseDatabase.<init>(CouchbaseDatabase.java:44)
[error]   at com.confidential.api.platform.play.db.couchbase.modules.CouchbaseDBModule.configure(CouchbaseDBModule.java:34) (via modules: com.google.inject.util.Modules$OverrideModule -> com.confidential.api.platform.play.db.couchbase.modules.CouchbaseDBModule)
[error]   while locating com.confidential.api.platform.play.db.couchbase.CouchbaseDatabase
[error]
[error] 1 error, took 5.369 sec
[error]     at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
[error]     at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
[error]     at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
[error]     at com.google.inject.Guice.createInjector(Guice.java:99)
[error]     at com.google.inject.Guice.createInjector(Guice.java:84)
[error]     at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185)
[error]     at play.inject.guice.GuiceBuilder.injector(GuiceBuilder.java:221)
[error]     at play.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.java:156)
[error]     at play.test.Helpers.fakeApplication(Helpers.java:186)
[error]     at play.test.WithApplication.provideApplication(WithApplication.java:31)
[error]     at play.test.WithApplication.startPlay(WithApplication.java:61)
[error]     ...
[error] Caused by: java.lang.NoSuchMethodError: com.couchbase.client.java.env.DefaultCouchbaseEnvironment$Builder.autoreleaseAfter(J)Lcom/couchbase/client/java/env/DefaultCouchbaseEnvironment$Builder;
[error]     at com.confidential.api.platform.play.db.couchbase.CouchbaseDatabase.<init>(CouchbaseDatabase.java:52)
[error]     at com.confidential.api.platform.play.db.couchbase.CouchbaseDatabase$$FastClassByGuice$$9045a375.newInstance(<generated>)
[INFO] [11/19/2019 13:31:35.338] [Thread-5] [CoordinatedShutdown(akka://sbt-web)] Starting coordinated shutdown from JVM shutdown hook
[error]     at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
[error]     at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:111)
[error]     at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)
[error]     at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268)
[error]     at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
[error]     at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
[error]     at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
[error]     at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
[error]     at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
[error]     at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
[error]     at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
[error]     at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
[error]     at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
[error]     at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
[error]     ... 43 more
[info] Test run finished: 1 failed, 0 ignored, 1 total, 5.395s
[info] ScalaTest
[info] Run completed in 9 seconds, 471 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error]         com.confidential.controllers.PctControllerTest
[success] Total time: 41 s, completed 19 Nov, 2019 1:31:35 PM
java junit playframework sbt couchbase
1个回答
2
投票

这是版本不兼容的问题。 SBT正在拉CouchbaseMock,该CouchbaseMock比我使用的Couchbase java-client (2.4.2)还早于java-client

我将(2.7.7)版本更改为Couchbase java-client,因为我想在测试用例中使用CouchbaseMock。

也可以通过从2.4.2删除build.sbt的CouchbaseMock行来解决

© www.soinside.com 2019 - 2024. All rights reserved.