Насмешливый скала - PullRequest
       23

Насмешливый скала

13 голосов
/ 26 августа 2010

Я использую 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 с объекта на класс, это сработает. Можно ли издеваться над объектами скалы с помощью мокито? Если да, то как?

Ответы [ 3 ]

10 голосов
/ 26 августа 2010

Как написано, ваш Sample - чистый синглтон.Его тип является его собственным, и есть только один член этого типа, точка.Scala object s может расширить другой класс (возможно, абстрактный, если он предоставляет необходимые определения, чтобы сделать его конкретным) и признаки.Выполнение этого дает ему идентичность типов, включающую этих предков.

Я не знаю, что на самом деле делает Mockito, но, на мой взгляд, то, что вы просите, строго расходится с тем, что Scala object is.

7 голосов
/ 27 декабря 2011

Я недавно выпустил ScalaMock , библиотеку-макет для Scala, которая может, среди прочего, макетировать синглтон (и сопутствующие) объекты.

7 голосов
/ 02 февраля 2011

Имейте в виду, что вы можете издеваться над методами над 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, поскольку введенная функция является аргументом по умолчанию.

...