嘲笑scala对象

问题描述 投票:12回答:3

我正在使用mockito并试图模拟scala对象。

object Sample { }
//test
class SomeTest extends Specification with ScalaTest with Mockito {
    "mocking should succeed" in {
        val mockedSample = mock[Sample]
     }
}

这给了我两个编译错误。

error: Not found type Sample
error: could not find implicit value for parameter m:
scala.reflect.ClassManifest[<error>]

如果我将Sample从对象更改为类,则可以正常工作。有可能用mockito模拟scala对象吗?如果有,怎么样?

scala object mocking mockito specs
3个回答
10
投票

如上所述,你的Sample是纯粹的单身人士。它的类型是它自己的,只有一个类型的成员,句号。 Scala objects可以扩展另一个类(可能是抽象的,如果它提供必要的定义以使其具体化)和特征。这样做会给它一个包含那些祖先的类型标识。

我不知道Mockito到底在做什么,但在我看来,你所要求的是与Scala object的内容完全不一致。


7
投票

我最近发布了ScalaMock,一个Scala的模拟库,除其他外,还可以模拟单例(和伴随)对象。


7
投票

请记住,如果你将它们提升到函数,你可以模拟object的方法。

case class Person(name: String)
object Person {
  def listToJson(lp: List[Person]) = "some actual implementation"
}

class ClassUnderTest(listToJson: (List[Person]) => String = Person.listToJson(_)) {
  def testIt(lp: List[Person]) = listToJson(lp)
}

import org.specs._
import org.specs.mock.Mockito
import org.mockito.Matchers._  

class ASpec extends Specification with Mockito {
  "a thing" should {
    "do whatever" in {
      val m = mock[(List[Person]) => String]
      val subject = new ClassUnderTest(m)
      m(Nil) returns "mocked!"
      subject.testIt(Nil) must_== "mocked! (this will fail on purpose)"
    }
  }
}

在这里,我不是在嘲笑对象Person,而是在它上面的方法(这可能是OP的意图)。

测试结果显示了模拟工作:

[info] == ASpec ==
[error] x a thing should
[error]   x do whatever
[error]     'mocked![]' is not equal to 'mocked![ (this will fail on purpose)]' (ASpec.scala:21)
[info] == ASpec ==

同时,由于注入函数是默认参数,ClassUnderTest的生产时间使用仅仅是new ClassUnderTest

© www.soinside.com 2019 - 2024. All rights reserved.