7

私は(Javaの)Scalaを初めて使用し、TDD/BDDを開発するのが好きです。ですから、Scalaについて多くを知る前に、私はすでにScalatestに飛び込んできました。

可能な限りテストしたいという観点から、ユニットテストの良いアクセス戦略は何だと思いますか。

テストしたいクラスWorldと、Worldについてすべてを知っているべきではないクラスAgentがあるとします。

package program {
  package world {
    class World {
      private var notForAgent
      def forAgentDuringActing
      // forAgentDuringActing has an important side effect in notForAgent
    } 
  }

  package agent {
    class Agent
    // would call World.forAgentDuringActing
  }

  package world.test {
    class WorldSpec extends FunSpec {
      describe("The world") {
        it("should have side-effect behaviour when the agent acts on it") {
          // ... the test ...
        }
      }
    }
  }
}

これらのパッケージ宣言は私にとって神聖ではないことに注意してください。私が本当に望んでいるのは、WorldSpecがWorldのコンパニオンオブジェクトのようなものになり、副作用をテストできるようにすることです。

アクセス修飾子修飾子が役立つかもしれないと思いました。私は言うことができますprivate[world] notForAgentが、それは本当に私が望むよりも多くのアクセスです。私が実際に欲しいのはのようなものですがprivate[this, test.WorldSpec] notForAgent、複数の修飾子は許可されていないと思います。

これをテスト可能にするために何をしますか?あるいは、私の考えが間違った方向に進んでいることを示すことができますか?

ps私は「プライベートをテストしない」というステートメントを知っています。しかし、「テストはコード自体よりも重要です。テストに必要な場合はアクセス修飾子を変更してください」という意見も知っています。ただし、このスレッドでのその議論は避けたいと思います。

4

1 に答える 1

10

「プライベートメソッドをテストする方法」を尋ねている場合、ScalaTestは実際にこれをサポートしています。ここを参照してください。

class C {
  private def m(x: Int) = x
}

class CTests extends /*any test suite you like*/ with PrivateMethodTester {
  val decoratedM = PrivateMethod[Int]('m)
  val c = new C
  val actual = c invokePrivate decoratedM(4711)
  val expected = 4711
  actual should be(expected) // this line depends on the test suite you've chosen
}
于 2012-06-11T19:07:55.373 に答える