【问题标题】:ScalaTest, Mockito, Guice and PartialMockingScalaTest、Mockito、Guice 和 PartialMocking
【发布时间】:2017-04-29 15:30:21
【问题描述】:

我正在使用 Google Guice 作为 DI 框架,并且我正在为使用 Google Guice 的类编写单元测试。我也在尝试进行部分模拟。

这是我写的代码

class Test1 {
   def test1() = "I do test1"
}
class Test2 {
   def test2() = "I do test2"
}
class TestPartialMock @Inject()(t1: Test1, t2: Test2) {
   def test3() = "I do test3"
   def createList() : List[String] = List(t1.test1(), t2.test2(), test3())
}

我的目标是为上面的代码编写一个测试用例,但我只想模拟test3

我写了这个测试用例

class TestModule extends AbstractModule with ScalaModule with MockitoSugar {
   override def configure() = {
      bind[Test1]
      bind[Test2]
      val x = mock[TestPartialMock]
      when(x.test3()).thenReturn("I am mocked")
      when(x.createList()).thenCallRealMethod()
      bind(classOf[TestPartialMock]).toInstance(x)
   }
}

class PartialMockTest extends FunSpec with Matchers {
   describe("we are testing workhorse but mock test3") {
      it("should return mock for test3") {
         val module = new TestModule
         val injector = Guice.createInjector(module)
         val tpm = injector.getInstance(classOf[TestPartialMock])
         val result = tpm.workHorse()
         result should contain ("I do test2")
         result should contain ("I do test1")
         result should contain ("I am mocked")
         result should not contain ("I do test3")
      }
   }
}

但是测试失败,依赖项出现空指针异常(调用 t1)

java.lang.NullPointerException
    at TestPartialMock.createList(TestPartialMock.scala:9)
    at PartialMockTest.$anonfun$new$2(PartialMockTest.scala:16)
    at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.Transformer.apply(Transformer.scala:22)
    at org.scalatest.Transformer.apply(Transformer.scala:20)
    at org.scalatest.FunSpecLike$$anon$1.apply(FunSpecLike.scala:454)

那么我怎样才能在模拟test3 方法的同时拥有注入的依赖项?

如果您需要查看这些,这是我的依赖项

"net.codingwell" %% "scala-guice" % "4.1.0",
"org.scalatest" % "scalatest_2.12" % "3.0.3",
"org.scalamock" % "scalamock-scalatest-support_2.12" % "3.5.0",
"org.mockito" % "mockito-core" % "2.7.22"

【问题讨论】:

    标签: scala unit-testing mockito guice scalatest


    【解决方案1】:

    诀窍是 Mockito 在创建模拟对象时不会调用(基)类的构造函数。因此TestPartialMock 的依赖关系没有被初始化。解决此问题的最简单方法是spy on a real object,您可以使用任何您想要的配置来创建它

    class TestModule extends AbstractModule with ScalaModule with MockitoSugar {
      override def configure() = {
        //bind[Test1]
        //bind[Test2]
        //val x = mock[TestPartialMock]
        val realObject = new TestPartialMock(new Test1, new Test2)
        val x = spy(realObject)
        when(x.test3()).thenReturn("I am mocked")
        when(x.createList()).thenCallRealMethod()
        bind(classOf[TestPartialMock]).toInstance(x)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多