嘲笑scala对象

时间:2010-08-26 14:47:31

标签: scala object mocking mockito specs

我正在使用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对象吗?如果是的话怎么样?

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

请注意,如果您将{em>

object

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

测试结果显示模拟工作:

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)"
    }
  }
}

同时,由于注入的函数是默认参数,因此[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

答案 2 :(得分:7)

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

答案 3 :(得分:2)

自从嘲笑scala的1.16.0版本开始,就可以模拟Scala ==,因此您可以检查文档here,但这只是它的外观示例。

object