这是一个常见问题的通用问题,让我们尽可能简单地描述它......假设我有:
class A {
def x() = //do something with e
def e() = //do something else
}
基本上是一个简单的类,其中方法 x()
调用方法 e()
。 x() 和 e() 的逻辑非常复杂。所以在集成中测试它们是不切实际的(通过调用 x()
和断言)。通过一些模拟,分别测试 x()
和 e()
会更容易。所以我可以去做:
abstract class A {
def x() = {
/* do */
}
def e()
}
object A {
def eImpl() = {}
def apply(): A = new A() {
override def e(): Unit = eImpl()
}
}
然后测试 x() 的行为:
class ASpec extends FlatSpec {
def eImpl() = {}
def mockedA(inner: A => Unit) = {
inner(new A {
override def e(): Unit = ??? //some behaviour to help test, a mock, etc..
})
}
"x in A" should "do this an that" in mockedA { a =>
}
"eImpl" should "do something else" in {
}
}
但是... 这假定伴生对象中的 A() 绑定(bind)了正确的实现。总而言之,这一切对我来说似乎有点冗长。那么,有什么方法可以构造此类以进行可靠测试并确保实例具有正确的实现?
最佳答案
你要找的不是spy
吗?
假设
class A {
def x(): String = "Hello" + e()
def e(): String = "World"
}
你可以分别模拟e()
和x()
:
import org.mockito.Mockito._
import org.scalatest.mockito.MockitoSugar
import org.scalatest.{Matchers, WordSpec}
class ASpec extends WordSpec with Matchers with MockitoSugar {
"Spy test" should {
"mock only e" in {
val a = spy(new A())
when(a.e()).thenReturn("Mock")
a.x() shouldBe "HelloMock"
a.e() shouldBe "Mock"
}
"mock only x" in {
val a = spy(new A())
when(a.x()).thenReturn("Yo" + a.e())
a.x() shouldBe "YoWorld"
a.e() shouldBe "World"
}
}
}
关于scala - 如何在 Scala 的测试中分解对象功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49223498/