Scala - 单元测试设置(使用访问修饰符限定符?)

时间:2012-06-11 16:43:27

标签: unit-testing scala scope tdd

我是Scala的新手(来自Java),我喜欢开发TDD / BDD。所以在了解Scala之前我已经潜入了Scalatest。

我想知道您认为单元测试的良好访问策略,从您希望尽可能多地进行测试的角度来看。

假设我有一个我想要测试的班级世界,以及一个不应该知道世界一切的班级代理。

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,但我认为不允许使用多个限定词。

你会怎么做才能使这个可测试?或者,你能指出我的想法走向错误的方向吗?

P.S。我知道这句话“从不测试私人”。但我也知道“测试比代码本身更重要。如果测试需要更改访问修饰符”。但是,我想在这个帖子中避免讨论。

1 个答案:

答案 0 :(得分:9)

如果你问“如何测试私有方法?”,那么ScalaTest实际上支持这一点。请参阅here

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
}