scala上@VisibleForTesting注释的行为

Jag*_*gat 0 junit scala mockito guava specs2

我正在测试我添加到scala类的方法,该构造函数被标记为私有.它可以通过一个单独的对象访问,它可以处理我不想触及的其他许多东西.

class DummyClass private (config: DummyConfig) extends Runnable {

   def refresh() = {
       // Does tons of things
   }

   def updateProperty() = {
      // My method
   }
}

Object DummyClass {
  def apply(config: DummyConfig) = {
     val clss = new DummyClass(config)
     clss.refresh()
     new Thread(clss).start()
     clss
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的JUnit(Specs/Mockito)中,我只想创建该类的对象并测试我添加的单个方法,而不是调用刷新或启动线程.

即使我在类DummyClass上添加guava的注释@VisibleForTesting,我也无法在JUnit测试中使用构造函数.有没有办法实现这一目标?

vpt*_*ron 5

这个@VisibleForTesting注释来自哪里?它是Guava图书馆提供的吗?

最有可能的是,这只是一个信息性的注释,仅用于记录您为方法/构造函数提供更轻松的可见性这一事实,只是为了允许单元测试.

在您的情况下,您必须实际更改构造函数的可见性:

package p

class DummyClass private[p] (config: DummyConfig) extends Runnable {

   def refresh() = {
       // Does tons of things
   }

   def updateProperty() = {
      // My method
   }
}
Run Code Online (Sandbox Code Playgroud)

在这里,如果您将单元测试放在包中p,则可以访问构造函数,因为它现在是包私有的.添加注释以指示不允许生产代码调用构造函数(但同样,它将取决于处理项目的其他开发人员的良好行为,编译器将不会根据注释强制执行任何操作).