我在Scala中有一个对象,如下面的
object Foo {
val launchDate = LocalDate.now()
...
}
我需要做一个单元测试,在这个单元测试中我将lauchDate替换为给定的日期,例如:2001年6月25日。有没有办法模仿launchDate
?你会建议我使用哪个框架?
谢谢
答案 0 :(得分:1)
我会在这里略微反对,并说日期/时间/时钟是你应该用“依赖注入”做的事情的典型例子之一。我使用引号,因为我认为只是将它作为构造函数arg传递,而不是所有那些花哨的框架。
我倾向于认为这种嘲讽应该是最后的手段。我宁愿这样做:
class Foo(clock: { def now(): LocalDate }) {
val launchDate = clock.now()
// ... rest of Foo's original implementation ...
}
object FooRealtime extends Foo(LocalDate) {
} // previous users of Foo can just use FooRealtime
然后在测试中,您可以传入一个不同的实现,返回您想要的任何日期。
答案 1 :(得分:0)
org.mockito.internal.util.reflection.Whitebox
似乎工作正常。既然你用mockito标记了这个问题,我认为你已经在类路径上已经有了这个问题。
Whitebox.setInternalState(Foo, launchDate, <your date>)
答案 2 :(得分:0)
我听说ScalaMock支持使用方法mockObject
模拟单例对象的功能。但它来自ScalaMock 3 removed。
但是如果你有一个特性而不是对象你可以使用ScalaTock 4和ScalaTest,即使用proxy.MockFactory
:
import java.time.LocalDate
import org.scalamock.scalatest.proxy.MockFactory
import org.scalatest.FunSuite
class FooTest extends FunSuite with MockFactory {
test("it should return local date") {
val launchDate: LocalDate = LocalDate.of(2017, 6, 15)
val m = mock[FooService]
m.expects('launchDate)().returning(launchDate)
assertResult(launchDate)(m.launchDate)
}
}
build.sbt
个依赖项:
libraryDependencies ++= Seq("org.scalactic" %% "scalactic" % "3.0.5",
"org.scalatest" %% "scalatest" % "3.0.5" % Test,
"org.scalamock" %% "scalamock" % "4.1.0" % Test)