我对Scala有点新意,正如标题中所说,我正试图嘲笑一个班级。
DateServiceTest.scala
@RunWith(classOf[JUnitRunner])
class DateServiceTest extends FunSuite with MockitoSugar {
val conf = new SparkConf().setAppName("Simple Application").setMaster("local")
val sc = new SparkContext(conf)
implicit val sqlc = new SQLContext(sc)
val m = mock[ConfigManager]
when(m.getParameter("dates.traitement")).thenReturn("10")
test("mocking test") {
val instance = new DateService
val date = instance.loadDates
assert(date === new DateTime())
}
}
DateService.scala
class DateService extends Serializable with Logging {
private val configManager = new ConfigManager
private lazy val datesTraitement = configManager.getParameter("dates.traitement").toInt
def loadDates() {
val date = selectFromDatabase(datesTraitement)
}
}
不幸的是,当我运行测试时, datesTraitement 返回null而不是10,但m.getparameter(“dates.traitement”)确实返回10.
也许我在某个地方做某种反模式,但我不知道在哪里,请记住我是所有这些的新手,我没有找到任何适合我在互联网上的案例。< / p>
感谢您的帮助。
答案 0 :(得分:3)
我认为问题是您的模拟未注入,因为您在ConfigManager
类中内联DateService
。
而不是
class DateService extends Serializable with Logging {
private val configManager = new ConfigManager
}
试
class DateService(private val configManager: ConfigManager) extends Serializable with Logging
并且在您的测试用例中,在构造DateService
时注入模拟的ConfigManagerclass DateServiceTest extends FunSuite with MockitoSugar {
val m = mock[ConfigManager]
val instance = new DateService(m)
}