1

私は を使用しようとしておりMavenCliByteArrayOutpurStream-s asstdoutおよびを指定していstderrます。一部のレコードがそれらのストリームに書き込まれたことを確認するテストがあります。テストが 1 つあれば、すべて問題ありません。しかし、別のテストを導入すると、stdout に何も書き込まれないため失敗します。

ここにスニペットがあります(Scala):

class MyIT extends SpecWithJUnit {

  sequential

  trait Ctx extends Scope {
    val outStream = new ByteArrayOutpurStream()
    val errStream = new ByteArrayOutpurStream()
    val pomDir = Files.createTempDirectory("test_pom_").toFile
    val mavenCli = new MavenCli()

    def haveWrote(str: String): Matcher[Int] = {
      contain(str) ^^ { (_: Int) => 
          new String(outStream.toByteArray, "UTF-8") aka "written records" }
    }

    def maven(pom: Elem, goals: String*): Int = {
      val pomFile = new File(pomDir, "pom.xml")

      XML.save(pomFile.getCanonicalPath, pom)

      System.setProperty(
          "maven.multiModuleProjectDirectory", 
          pomDir.getCanonicalPath)

      mavenCli.doMain(
          goals.toArray,
          pomDir.getCanonicalPath, 
          new PrintStream(outStream), 
          new PrintStream(errStream))
    }
  }


  "test 1" should {
    "write something" in new Ctx {
      val pomXml =
        <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns="http://maven.apache.org/POM/4.0.0">
          <modelVersion>4.0.0</modelVersion>

          <groupId>com.company</groupId>
          <artifactId>some-artifact-id</artifactId>
          <version>1.0.0-SNAPSHOT</version>
          <description>some meaningful description</description>
          <name>some catchy name</name>
          ...
        </project>

      maven(pomXml, "clean" "validate") must haveWrote("something")
    }

    "write something else" in new Ctx {
      val pomXml =
        <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns="http://maven.apache.org/POM/4.0.0">
          <modelVersion>4.0.0</modelVersion>

          <groupId>com.company</groupId>
          <artifactId>some-artifact-id</artifactId>
          <version>1.0.0-SNAPSHOT</version>
          <description>some meaningful description</description>
          <name>some catchy name</name>
          ... (different than the "write something" test)
        </project>

      maven(pomXml, "clean" "validate") must haveWrote("something else")
    }
  }
}

"write something"テストをコメントアウトすると、"write something else"パスします。

"write something else"testをコメントアウト(およびコメント解除"write something") すると、"write something"パスします。

両方がコメント解除されて実行された場合、一方が失敗します ("write something else"シーケンシャルであるため)。

println-s ofoutStreamをmaven実行後に追加すると、原因outStreamは空であるようです...

理由、またはさらに重要なことに、回避方法がわかりません。

何か案は?...

前もって感謝します、オハッド

4

1 に答える 1