15

私はmockitoを使用していて、scalaオブジェクトをモックしようとしています。

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

これにより、2つのコンパイルエラーが発生します。

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

サンプルをオブジェクトからクラスに変更すると、機能します。mockitoでscalaオブジェクトをモックすることは可能ですか?はいの場合、どのように?

4

4 に答える 4

15

書かれているように、あなたSampleは純粋なシングルトンです。そのタイプは独自のものであり、そのタイプのメンバーは期間が1つだけです。Scalaは、別objectのクラス(具体的にするために必要な定義を提供する場合は抽象化される可能性があります)と特性を拡張できます。そうすることで、それらの祖先を含むタイプIDが与えられます。

Mockitoが実際に何をしているのかはわかりませんが、私の考えでは、あなたが求めているのは、Scalaobjectが何であるかと厳密に対立しています。

于 2010-08-26T14:54:48.760 に答える
10

関数に持ち上げると、のメソッドをモックできることに注意してください。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 ==

一方、の生産時の使用はClassUnderTestnew ClassUnderTest注入された関数がデフォルトの引数であるためです。

于 2011-02-02T11:50:23.580 に答える
8

mockito-scalaのバージョン1.16.0以降、Scalaをモックすることが可能であるため、ここobjectでドキュメントを確認できますが、これはどのように見えるかの例です。

object FooObject {
 def simpleMethod: String = "not mocked!"
}

"mock" should {
 "stub an object method" in {
   FooObject.simpleMethod shouldBe "not mocked!"

   withObjectMocked[FooObject.type] {
     FooObject.simpleMethod returns "mocked!"
     //or
     when(FooObject.simpleMethod) thenReturn "mocked!"

     FooObject.simpleMethod shouldBe "mocked!"
   }

   FooObject.simpleMethod shouldBe "not mocked!"
 }
}
于 2020-09-27T21:20:24.050 に答える
7

私は最近、ScalaのモックライブラリであるScalaMockをリリースしました。これは、とりわけ、シングルトン(およびコンパニオン)オブジェクトをモックすることができます。

于 2011-12-27T00:01:53.440 に答える