2010-08-26 95 views
9

我正在使用mockito并试图嘲笑一个scala对象。嘲笑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>] 

如果我将样品从对象更改为类,它的工作原理。 是否可以用mockito模拟scala对象?如果是的话如何?

回答

10

正如你所写,你的Sample是一个纯粹的单身人士。它的类型是它自己的,并且只有一个这种类型的成员。斯卡拉object s 可以扩展另一个类(可能抽象,如果它提供必要的定义,使其具体)和性状。这样做会赋予它包含这些祖先的类型标识。

我不知道Mockito真的在做什么,但在我看来,你所要求的与Scala object是完全不一样的。

+3

肯定同意这里。你可能会尝试模拟[Sample.type],但我怀疑它在实践中会起作用。我建议让Sample扩展一些界面特征并将其模拟出来。 最大的问题是,如果你想注入你的模拟代替singleton Sample,你必须做一些好的,邪恶的,有趣的反射魔法。如果你有兴趣,我们可以发布。 – jsuereth 2010-08-26 14:56:54

+0

我前几天在查看Mockito源代码以回答相关问题(由于某种原因,现在我找不到),我似乎回想起看到其中一个“模拟”生成器只返回特定值而不是尝试生成替代/变体。 – 2010-08-26 15:14:09

+0

有没有办法用Powermock或类似的方法做到这一点?如果我在伴侣对象上有一个(有效的全局)方法,那么想要嘲笑它的行为似乎是合理的;当然,这是红宝石世界中的一种常见模式。 – Korny 2011-02-01 03:23:28

6

请记住,你可以模拟方法的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)" 
    } 
    } 
} 

在这里,我不是嘲笑对象人,但它的方法(这可能是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由于注入的功能是默认参数。

9

我最近发布了ScalaMock,这是一个Scala的模拟库,它可以模拟单身(和伴侣)对象。

+4

在提供的页面上,对单身人士和伴侣对象的支持在标题为“未来计划”的部分中声明。框架目前是否支持这些功能? – Zotov 2013-05-22 11:51:58

+2

@Zotov,似乎对模仿对象的支持只能在ScalaMock2中使用2.9编译器插件,如[教程]中所述(http://paulbutcher.com/2011/11/06/scalamock-一步步/)。 ScalaMock3不需要编译器插件,因为它依赖于Scala 2。10宏,但它不支持ScalaMock2的所有功能,正如本文[博客文章]中所述(http://paulbutcher.com/2012/06/04/scalamock-3-0-preview-release /)。因此,在2.10中不支持嘲讽对象: 据我所知,这似乎仍然是该项目的当前状态。 – 2014-01-04 04:38:22

+0

这个库仍然不能很好地工作 – danielrvt 2014-08-26 14:33:53