如何创建包私有类的模拟对象

时间:2018-07-26 15:59:03

标签: scala companion-object scalamock package-private

我上课。它有一个带有工厂方法的伴随对象A

class A private [somepackage](x:Int){

}

对象A {  def createA(y:Int):A = {   新的A(y) } }

现在,我需要在其他程序包中的scalatest文件中创建A的模拟对象。

我给

priv val a =模拟[A]->我收到编译错误。

无法在<< {A >>中访问类A中的

构造函数somewhere。 有没有更好的方法来模拟对象?

2 个答案:

答案 0 :(得分:1)

在您的测试源中,在同一程序包中创建一个双重测试:

package somepackage

class MockableA extends A(0)

然后只需在测试中创建一个mock[MockableA],然后照常进行即可。

但是,如果您愿意更改生产来源以方便测试,则使用代理/外观的答案也应该起作用。

答案 1 :(得分:0)

考虑使用代理访问类A,然后对该代理类进行存根/模拟。 例如,如果A.doStuff是您要模拟/存根的对象,而A.accessStuff是您在代码中需要的对象,则创建一个类

class ADecorated(underlying: A) {
  def doStuff() {
    underlying.doStuff()
    // whatever I want to do
  }

  def accessStuff() {
    x = underlying.accessStuff()
    // do something else and return
  }
 // Any other method you want to use
}

用新的A.createA代替ADecorated(A.createA())的用法。 ADecorated是您现在使用的东西