使用ScalaTest测试包含@Autowired和私有字段的java

时间:2015-05-14 16:40:11

标签: java scala mockito private scalatest

我已经开始使用ScalaTest来测试我的Java代码了,我喜欢它(我已经阅读了#34;在Scala中测试"本书)。

最近,我一直在尝试测试一些包含标记为private@Autowired的字段的java Spring代码。这些字段没有setter方法。

我意识到我可以使用注释@InjectMocks@Mock轻松地使用JUnit + Mockito测试它们,但是,我想使用ScalaTest和模拟框架(例如Mockito或ScalaMock)测试它们)。

我的问题:可以使用Scalatest + Mockito模拟私有字段,或者这些框架要求我的java类为我的public + private字段定义了@Autowired setter方法?

3 个答案:

答案 0 :(得分:2)

您可以使用InjectMocks执行此操作。以下是使用ScalaTest和Mockito测试包含@Autowired成员的类的工作示例:

import org.mockito.{MockitoAnnotations, InjectMocks, Mock}
import org.scalatest.{FunSpec, BeforeAndAfter}
import org.scalatest.Matchers._
import org.mockito.Mockito._
import org.springframework.beans.factory.annotation.Autowired

class InjectMocksSpec extends FunSpec with BeforeAndAfter {

  @Mock
  var paramMock: MockedClass = null

  @InjectMocks
  var testClass = new TestClass()

  describe("InjectMocks") {
    it("should inject mock for Autowired field") {
      MockitoAnnotations.initMocks(this)

      when(paramMock.get).thenReturn("bar")

      testClass.test should be("bar")

      verify(paramMock, times(1)).get
    }
  }

}

class MockedClass {
  def get: String = {
    "foo"
  }
}

class TestClass {
  @Autowired
  var param: MockedClass = null

  def test: String = {
    param.get
  }
}

答案 1 :(得分:0)

根据我的经验,将setter添加到那些自动装配的bean会好得多。否则,你要注入所需行为的唯一方法就是通过一个复杂的反思过程,这只会使问题复杂化。

为了明确表示不能在测试之外使用setter,你可以做几件事:

  • 将它们标记为包私有

    void setDao(final Dao dao) {
        this.dao = dao;
    }
    
  • 使用来自Guava的@VisibleForTesting注释它们

或者,可能是重新审视自动装配方案的好时机;如果你有很多豆子可以自动接线,它会变得非常笨重。

答案 2 :(得分:0)

您可以在@Mock

中使用import org.mockito.MockitoAnnotations.Mock注释

@Mock private var someDao:SomeDao =_

这有效但不建议使用。它也被弃用了