scala - 如何在 Scala 的测试中分解对象功能

标签 scala unit-testing testing mocking

这是一个常见问题的通用问题,让我们尽可能简单地描述它......假设我有:

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/

相关文章:

java - 如何处理通过 Scala/Java ProcessBuilder 发送的 SSH 命令上的空格?

scala - 在 Zeppelin 中指定与分类器的依赖关系

unit-testing - 由于找不到 "TechTalk.SpecFlow"文件,SpecFlow 单元测试失败

c# - 如何对私有(private)属性进行单元测试?

java - 如何对方法的立即退出进行单元测试

python - 为什么 caplog.text 是空的,即使我正在测试的函数正在记录?

testing - TestCafe与 Electron : can't load main page (main page may return a '304' http code)

sql - Scala Spark Cassandra 在主键匹配上更新或插入行

Scala:具有复杂结构的树插入尾递归

java - 无法使用 Mockito 或 PowerMockito 的反射对 Java 代码进行单元测试