我正在测试我添加到一个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
}
}
在我的JUnit (Specs/Mockito)中,我只想创建该类的对象并测试我添加的单个方法,而不需要调用refresh或启动线程。
即使我在类DummyClass上添加了guava的注释@VisibleForTesting,我也不能在JUnit测试中使用构造函数。我有办法做到吗?
这个@VisibleForTesting
注释来自哪里?是Guava库提供的那个吗?
很可能,这只是一个信息性的注释,只是用来说明这样一个事实,即您为方法/构造函数提供了更宽松的可见性,只是为了允许单元测试。
在你的情况下,你必须实际上改变构造函数的可见性:
package p
class DummyClass private[p] (config: DummyConfig) extends Runnable {
def refresh() = {
// Does tons of things
}
def updateProperty() = {
// My method
}
}
如果你把你的单元测试放在包p
中,你可以访问构造函数,因为它现在是包私有的。添加注释以表明不允许任何产品代码调用构造函数(但是,它将再次依赖于在项目中工作的其他开发人员的良好行为,编译器将不会基于注释强制执行任何内容)。