模拟具有特征的类

时间:2011-10-02 10:45:52

标签: scala mocking traits

是否有任何库提供用于模拟具有特征的类的工具(两者都可以是有状态的)?

简化示例:

trait T {
  var xx: List[Int] = List[Int]()
  def t(x: Int) {
    xx ::= x    //throws NPE, xx == null, even after implicit initialization
  }
}

class A extends T {
}

class Testable(a: A) {
  def bar() {
    a.t(2)
  }
}

@Test def testFoo() {
  val a: A = mock[A]
  val testable = new Testable(a)
  testable.bar()
  verify(a).t(2)
}

3 个答案:

答案 0 :(得分:5)

Paul Butcher一直在研究Scala模拟库Borachio。它支持模拟特征,类,函数和对象。有关更多信息,请参阅以下博客:

http://www.paulbutcher.com/2011/02/announcing-borachio-native-scala-mocking/ http://www.paulbutcher.com/2011/07/power-mocking-in-scala-with-borachio/

答案 1 :(得分:2)

嗯......我没有答案,但我想我可以提供问题所在的提示。我看了一下A.class并发现了这个(de.schauderhaft.testen是我用的包):

  // Method descriptor #21 (I)V
  // Stack: 2, Locals: 2
  public bridge void t(int x);
    0  aload_0 [this]
    1  iload_1 [x]
    2  invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]
    5  return
      Line numbers:
        [pc: 0, line: 13]
      Local variable table:
        [pc: 0, pc: 6] local: this index: 0 type: de.schauderhaft.testen.A
        [pc: 0, pc: 6] local: x index: 1 type: int 

我不是字节码专家,但是这个

2  invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]

看起来对t(Int)的调用实际上是一个静态方法的调用,你不能模拟静态方法。 PowerMock会有所帮助,但可能难以使用。

答案 2 :(得分:1)

我刚刚发布了ScalaMock 2.0。除了函数和接口,ScalaMock还可以模拟:

  • 单身和伴侣对象(静态方法)
  • 对象创建(构造函数调用)
  • 具有私有构造函数的类
  • 最终类和最终方法的类
  • 运算符(带符号名称的方法)
  • 重载方法