使用 jacoco4sbt (2.1.4)从Play控制台运行 jacoco:cover 会导致许多测试失败并且消息如下:

[debug]运行TaskDef(com.ourCompany.ourProject.identity.LoginControllerSpec,org.scalatest.tools.Framework$$anon$1@5b98f69a,false,[SuiteSelector])java.lang.NoClassDefFoundError:无法初始化类com.sun位于com.sun.xml.internal.ws.wsdl.parser的com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parseBinding(RuntimeWSDLParser.java:445)中的.xml.internal.ws.api.BindingID . Run.comWSDLarser.parseWSDL(RuntimeWSDLParser.java:342)位于com.sun.xml.internal.ws.wsdl.parser的com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:157) . 运行时WSDLParser.parse(RuntimeWSDLParser.java:120)位于com.sun.xml.internal.ws.client.WSServiceDelegate的com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:257) . (WSServiceDelegate) .java:220)at com.sun.xml.internal.ws.client.WSServiceDelegate . (WSServiceDelegate.java:168)at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:96)在javax.xml.ws.Service . (Service.j ava:77)com.bsl.Services . (Services.java:46)at com.ourCompany.ourProject.identity.UserRepositoryComponent $ OdsUserRepository . (UserRepositoryComponent.scala:92)at com.ourCompany.ourProject.identity.ComponentRegistry $ class . $ init $(ComponentRegistry.scala:7)at com.ourCompany.ourProject.identity.LoginControllerSpec $ TestLoginController $ . (LoginControllerSpec.scala:20)at com.ourCompany.ourProject.identity.LoginControllerSpec.TestLoginController $ lzycompute(LoginControllerSpec.scala :20)com.ourCompany.ourProject.identity.LoginControllerSpec.TestLoginController(LoginControllerSpec.scala:20)at com.ourCompany.ourProject.identity.LoginControllerSpec $$ anonfun $ 1.apply $ mcV $ sp(LoginControllerSpec.scala:32)at at com.ourCompany.ourProject.identity.LoginControllerSpec $$ anonfun $ 1.apply(LoginControllerSpec.scala:32)位于org.scalatest的com.ourCompany.ourProject.identity.LoginControllerSpec $$ anonfun $ 1.apply(LoginControllerSpec.scala:32) . Transformer $$ anonfun $在org.sc上申请$ 1.apply(Transformer.scala:22) alatest.Transformer $$ anonfun $应用$ 1.apply(Transformer.scala:22)在org.scalatest.OutcomeOf $ class.outcomeOf(OutcomeOf.scala:85)org.scalatest.OutcomeOf $ .outcomeOf(OutcomeOf.scala:104) )org.scalatest.Transformer.apply(Transformer.scala:22)org.scalatest.Transformer.apply(Transformer.scala:20)at org.scalatest.FlatSpecLike $$ anon $ 1.apply(FlatSpecLike.scala:1636) at org.scalatest.Suite $ class.withFixture(Suite.scala:1121)atg.scalatest.FlatSpec.withFixture(FlatSpec.scala:1683)at org.scalatest.FlatSpecLike $ class.invokeWithFixture $ 1(FlatSpecLike.scala:1633) at org.scalatest.FlatSpecLike $$ anonfun $ runTest $ 1.apply(FlatSpecLike.scala:1645)org.scalatest.FlatSpecLike $$ anonfun $ runTest $ 1.apply(FlatSpecLike.scala:1645)at org.scalatest.SuperEngine.runTestImpl (Engine.scala:306)org.scalatest.FlatSpecLike $ class.runTest(FlatSpecLike.scala:1645)atg.scalatest.FlatSpec.runTest(FlatSpec.scala:1683)at org.scalatest.FlatSpecLike $$ anonfun $ runTests $ 1.apply(FlatSpecLike.scala:1703)在org . scalatest.FlatSpecLike $$ anonfun $ runTests $ 1.apply(FlatSpecLike.scala:1703)org.scalatest.SuperEngine $$ anonfun $ traverseSubNodes $ 1 $ 1.apply(Engine.scala:413)at org.scalatest.SuperEngine $$ anonfun $ traverseSubNodes $ 1 $ 1.apply(Engine.scala:401)位于org.scalatest的org.scalatest.SuperEngine.traverseSubNodes $ 1(Engine.scala:401)的scala.collection.immutable.List.foreach(List.scala:318) . SuperEngine.org $ scalatest $ SuperEngine $$ runTestsInBranch(Engine.scala:390)at org.scalatest.SuperEngine $$ anonfun $ traverseSubNodes $ 1 $ 1.apply(Engine.scala:427)at org.scalatest.SuperEngine $$ anonfun $ traverseSubNodes位于org.scalatest.SuperEngine的org.scalatest.SuperEngine.traverseSubNodes $ 1(Engine.scala:401)的scala.collection.immutable.List.foreach(List.scala:318)$ 1 $ 1.apply(Engine.scala:401) .org $ scalatest $ SuperEngine $$ runTestsInBranch(Engine.scala:396)org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)atg.scalatest.FlatSpecLike $ class.runTests(FlatSpecLike.scala:1703)at org .scalatest.FlatSpec.runTes ts(FlatSpec.scala:1683)org.scalatest.Suite $ class.run(Suite.scala:1423)at org.scalatest.FlatSpec.org $ scalatest $ FlatSpecLike $$ super $ run(FlatSpec.scala:1683)at at org.scalatest.FlatSpecLike $$ anonfun $ run $ 1.apply(FlatSpecLike.scala:1749)at org.scalatest.FlatSpecLike $$ anonfun $ run $ 1.apply(FlatSpecLike.scala:1749)at org.scalatest.SuperEngine.runImpl( Engine.scala:545)org.scalatest.FlatSpecLike $ class.run(FlatSpecLike.scala:1749)at com.ourCompany.ourProject.identity.LoginControllerSpec.org $ scalatest $ BeforeAndAfterAll $$ super $ run(LoginControllerSpec.scala:11 )org.scalatest.BeforeAndAfterAll $ class.liftedTree1 $ 1(BeforeAndAfterAll.scala:257)org.scalatest.BeforeAndAfterAll $ class.run(BeforeAndAfterAll.scala:256)at atcom.ourCompany.ourProject.identity.LoginControllerSpec.run(LoginControllerSpec.scala:11)at org.scalatest.tools.Framework.org $ scalatest $ tools $ Framework $ runSuite(Framework.scala:444)at org.scalatest.tools .Framework $ ScalaTestTask.execute(Framework.scala:651)at sbt.TestRunner.runTest $ 1(TestFramework.scala:84)at sbt.TestRunner.run(TestFramework.scala:94)at sbt.TestFramework $$ anon $ 2 $$ anonfun $$ init $$ 1 $$ anonfun $ apply $ 8.apply(TestFramework.scala:224)at sbt.TestFramework $$ anon $ 2 $$ anonfun $$ init $$ 1 $$ anonfun $ apply $ 8.apply(TestFramework.scala: 224)at sbt.TestFramework $ .sbt $ TestFramework $$ withContextLoader(TestFramework.scala:212)at sbt.TestFramework $$ anon $ 2 $$ anonfun $$ init $$ 1.apply(TestFramework.scala:224)at sbt.TestFramework $$ anon $ 2 $$ anonfun $$ init $$ 1.apply(TestFramework.scala:224)at sbt.TestFunction.apply(TestFramework.scala:229)at sbt.Tests $ .sbt $ Tests $$ processRunnable $ 1(Tests . scala:211)at sbt.Tests $$ anonfun $ makeSerial $ 1.apply(Tests.scala:217)at sbt.Tests $$ anonfun $ makeSerial $ 1.apply(Tes ts.scala:217)at sbt.std.Transform $$ anon $ 3 $$ anonfun $ apply $ 2.apply(System.scala:45)at sbt.std.Transform $$ anon $ 3 $$ anonfun $ apply $ 2.apply( System.scala:45)at sbt.std.Transform $$ anon $ 4.work(System.scala:64)at sbt.Execute $$ anonfun $ submit $ 1 $$ anonfun $ apply $ 1.apply(Execute.scala:237) at sbt.Execute $$ anonfun $ submit $ 1 $$ anonfun $ apply $ 1.apply(Execute.scala:237)at sbt.ErrorHandling $ .wideConvert(ErrorHandling.scala:18)at sbt.Execute.work(Execute.scala: 244)at sbt.Execute $$ anonfun $ submit $ 1.apply(Execute.scala:237)at sbt.Execute $$ anonfun $ submit $ 1.apply(Execute.scala:237)at sbt.ConcurrentRestrictions $$ anon $ 4 $$ anonfun $ 1.apply(ConcurrentRestrictions.scala:160)位于java.util的java.util.concurrent.FutureTask.run(FutureTask.java:262)的sbt.CompletionService $$ anon $ 2.call(CompletionService.scala:30) . concurrent.Executors $ RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask.run(FutureTask.java:262)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)a t java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:744)[error]无法运行测试com.ourCompany.ourProject.identity.LoginControllerSpec :java.lang.NoClassDefFoundError:无法初始化类com.sun.xml.internal.ws.api.BindingID

LoginControlerSpec

package com.ourCompany.ourProject.identity

import org.scalatest.{ Matchers, BeforeAndAfterAll, FlatSpec }
import play.api.test.{ FakeApplication, FakeRequest }
import com.ourCompany.ourProject.tags.UnitTest
import play.api.Play
import org.specs2.mock.Mockito
import play.api.test.Helpers._

@UnitTest
class LoginControllerSpec extends FlatSpec with BeforeAndAfterAll with Mockito with Matchers {
  override def beforeAll() {
    Play.start(FakeApplication())
  }

  override def afterAll() {
    Play.stop()
  }

  object TestLoginController extends LoginController with Secured with ComponentRegistryMock

  val Home = "/"
  val username = "XXX@ourCompanyprofessional.com"
  val password = "XXX1"
  val isRememberMe = false
  val expirationPolicy = SessionExpirationPolicy
  val odsUser = OdsUser(Identity(username, ""), Some(username))

  behavior of "LoginController"

  it should "send 200 for renderLoginForm with not authenticated user" in {
    status(TestLoginController.renderLoginForm(FakeRequest())) should be(OK)
  }

  it should "send 303 for renderLoginForm with authenticated user" in {
    val cookie = TestLoginController.authenticatorService.create(odsUser.identity, expirationPolicy) match {
      case Right(a: Authenticator) => a.toCookie
      case _ => fail()
    }
    TestLoginController.userRepository.find(odsUser.identity.userId) returns Some(odsUser)
    val result = TestLoginController.renderLoginForm(FakeRequest().withCookies(cookie))
    redirectLocation(result) should be(Some(Home))
    status(result) should be(SEE_OTHER)
  }

  it should "send 303 for login with valid credentials" in {
    val fakeRequest = FakeRequest().withFormUrlEncodedBody(
      UsernameField -> username, PasswordField -> password, RememberMeField -> isRememberMe.toString)

    TestLoginController.userRepository.login(username, password) returns Right(odsUser)
    val result = TestLoginController.login(fakeRequest)
    cookies(result).get(Authenticator.cookieName) match {
      case Some(c) => assert(c.name == Authenticator.cookieName && !c.value.isEmpty)
      case _ => fail()
    }
    redirectLocation(result) should be(Some(Home))
    status(result) should be(SEE_OTHER)
  }

  it should "send 400 for login with invalid credentials" in {
    val fakeRequest = FakeRequest().withFormUrlEncodedBody(
      UsernameField -> username, PasswordField -> password, RememberMeField -> isRememberMe.toString)

    TestLoginController.userRepository.login(username, password) returns Left(new Error)
    val result = TestLoginController.login(fakeRequest)
    status(result) should be(BAD_REQUEST)
  }

  it should "send 400 for login with invalid form input" in {
    val fakeRequest = FakeRequest().withFormUrlEncodedBody(
      UsernameField -> "", PasswordField -> "", RememberMeField -> "")

    val result = TestLoginController.login(fakeRequest)
    status(result) should be(BAD_REQUEST)
  }

}

build.sbt

gitHeadCommitSha in ThisBuild := Process("git rev-parse HEAD").lines.head

(testOptions in Test) += Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/report")

org.scalastyle.sbt.ScalastylePlugin.Settings

scalacOptions := Seq("-feature")

build.scala

import com.typesafe.sbt.SbtNativePackager._
import com.typesafe.sbt.SbtScalariform._
import play.Project._
import sbt.Keys._
import sbt._
import sbtbuildinfo.Plugin._
import scala._
import scala.util.Try
import scala.Some
import de.johoop.jacoco4sbt.JacocoPlugin._

object BuildSettings {
  val buildOrganization = "com.ourCompany.ourProject"
  val buildVersion      = "0.1-SNAPSHOT"
  val buildScalaVersion = "2.10.2"
  val envConfig = "-Djava.awt.headless=true -Dsbt.log.format=false -Dconfig.file=" + 
      Option(System.getProperty("env.config")).getOrElse("local.application")
  val maxErrors = 20
  // disable running browserstack tests by default. Possible options: true | false [default]
  val browserstack: Boolean = Try(System.getProperty("test.browserstack").toBoolean).getOrElse(false)

  val buildSettings = Defaults.defaultSettings ++ Seq (
    organization := buildOrganization,
    version      := buildVersion,
    scalaVersion := buildScalaVersion,
    scalacOptions ++= Seq("-unchecked", "-optimise", "-deprecation",
      "-Xcheckinit", "-encoding", "utf8", "-feature", "-Yinline-warnings",
      "-Xfatal-warnings"),
    javaOptions ++= Seq("-Xms512M","-Xmx1536M", "-Xss1M", "-XX:ReservedCodeCacheSize=192M",
      "-XX:+CMSClassUnloadingEnabled", "-XX:MaxPermSize=512M"),
    javaOptions += envConfig,
    publishMavenStyle := false
  )
}

object Resolvers {
  val remoteRepoUrl = "ourCompany Nexus Snapshots" at "http://nexus.ci.bln.ourCompany-xxx.com/content/repositories/snapshots/"
  val publishRepoUrl = "ourCompany Nexus Snapshots" at "http://nexus.ci.bln.ourCompany-xxx.com/content/repositories/snapshots/"
  val releaseRepoUrl = "ourCompany Nexus Releases" at "http://nexus.ci.bln.ourCompany-xxx.com/content/repositories/releases/"
}

object Dependencies {
  val ods =  "de.bsmo.ourCompany-professional" % "sprprof-ws" % "2.2.1-SNAPSHOT"
  val scalatest = "org.scalatest" %% "scalatest" % "2.0" % "test->*"  withSources()
  val mockito = "org.mockito" % "mockito-all" % "1.9.5" % "test"
  val ghostDriver = "com.github.detro.ghostdriver" % "phantomjsdriver" % "1.0.3" % "test"
  val cmsClient = "com.ourCompany.cms.ws.clients" % "ourCompany-cms-java-api" % "1.1.6"
  val solrjClient = "org.apache.solr" % "solr-solrj" % "4.3.1" % "compile"
}

object ApplicationBuild extends Build {

  import BuildSettings._
  import Dependencies._
  import Resolvers._

  // Sub-project specific dependencies
  val commonDeps = Seq(
    ods,
    scalatest,
    mockito,
    ghostDriver,
    cmsClient,
    jdbc,
    anorm,
    filters,
    solrjClient,
    cache
  )
  //val bN = settingKey[Int]("current build Number")
  val gitHeadCommitSha = settingKey[String]("current git commit SHA")
  val release = settingKey[Boolean]("Release")

  lazy val ourProject = play.Project(
    "ourProject",
    path = file("."),
    settings = Defaults.defaultSettings ++ buildSettings ++
      Seq(libraryDependencies ++= commonDeps) ++
      Seq(scalariformSettings: _*) ++
      Seq(playScalaSettings: _*) ++
      Seq(publishArtifact := false) ++
      buildInfoSettings ++
      jacoco.settings ++
      Seq(
        sourceGenerators in Compile <+= buildInfo,
        buildInfoKeys ++= Seq[BuildInfoKey](
          resolvers,
          libraryDependencies in Test,
          buildInfoBuildNumber,
          BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
          "envConfig" -> envConfig, // computed at project load time
          BuildInfoKey.action("buildTime") {
            System.currentTimeMillis
          } // re-computed each time at compile
        ),
        buildInfoPackage := "com.ourCompany.ourProject"
      ) ++
      Seq(resolvers += remoteRepoUrl) ++
      Seq(resolvers += releaseRepoUrl) ++
      Seq(mappings in Universal ++= Seq(
        file("ops/rpm/start-server.sh") -> "start-server.sh",
        file("ops/rpm/stop-server.sh") -> "stop-server.sh"
      )) ++
      Seq(testOptions in Test += Tests.Argument(if(browserstack) "-n" else "-l", "com.ourCompany.ourProject.tags.BrowserStackTest"))
  ).settings(version <<=  version in ThisBuild)
  .settings(parallelExecution in jacoco.Config := false)
  .settings({
    if(browserstack) {
      javaOptions in Test += "-Dconfig.file=conf/browserstack.application.conf"
    } else {
      javaOptions in Test += "-Dtest.none=true"
    }
  })



  lazy val ourProjectPackaging = Project(
    "packaging",
    file("ourProjectPackaging"), settings=
      Defaults.defaultSettings ++
      Seq(Packaging.settings:_*) ++
      Seq(resolvers += publishRepoUrl) ++
      buildSettings ++
      publishSetting ++
      Seq(publishArtifact := false) ++
      credentialsSetting
  ).settings(Packaging.rpmDistSettings: _*).settings(version <<=  version in Rpm )

  lazy val credentialsSetting = credentials += {
    Seq("NEXUS_USER", "NEXUS_PASSWORD").map(k => Option(System.getenv(k))) match {
      case Seq(Some(user), Some(pass)) =>
        Credentials("Sonatype Nexus Repository Manager",
          "nexus.ci.bln.ourCompany-xxx.com", user, pass)
      case _ =>
        Credentials(Path.userHome / ".ivy2" / ".credentials")
    }
  }

  lazy val publishSetting = publishTo <<= version.apply{
    v =>
      val nexus = "http://nexus.ci.bln.ourCompany-xxx.com/"
      if (v.trim.endsWith("SNAPSHOT"))
        Some("snapshots" at nexus + "content/repositories/snapshots")
      else
        Some("releases" at nexus + "content/repositories/snapshots")
  }
}

Sequenze of commands

  • 开始播放控制台(播放)

  • 清洁

  • jacoco:封面

Details

播放版本:使用Scala 2.10.2构建的播放2.2.1(运行Java 1.7.0_45)播放:

[info] This is sbt 0.13.0
[info] The current project is {file:/home/schl14/work/ProjektName/}ProjektName 0.1-b012d0e6a2c5b4a746490c0d34856af5e7d09bb9
[info] The current project is built against Scala 2.10.2
[info] Available Plugins: play.Project, com.typesafe.sbteclipse.plugin.EclipsePlugin, org.sbtidea.SbtIdeaPlugin, com.typesafe.sbt.SbtNativePackager, com.typesafe.sbt.SbtScalariform, sbtbuildinfo.Plugin, org.scalastyle.sbt.ScalastylePlugin, de.johoop.jacoco4sbt.JacocoPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.2

Question

它以前工作(如许多提交前),我没有确定源代码的哪些更改 jacoco:cover 失败 . 可能是这种行为的原因是什么?

一旦解决了,我将减少这里发布的不必要的信息量!目前很难确定需要提供什么 .