使用Scalatest测试包含@Autowied和私有字段的Java



我已经开始使用scalatest测试我的Java代码,并且我喜欢它(我已经阅读了" Scala中的测试"书)。

最近,我一直在尝试测试一些包含标记为private@Autowired的字段的Java弹簧代码。这些字段没有设置器方法。

我意识到我可以使用注释@InjectMocks@Mock轻松地使用Junit Mockito对它们进行测试,但是,我想使用Scalatest和模拟框架(例如Mockito或Scalamock)进行测试。

我的问题:可以使用scalatest ockito模拟私人字段,或者这些框架要求我的Java类具有为我的private @Autowired字段定义的public设置器方法?

您可以使用注射剂进行操作。这是使用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
  }
}

根据我的经验,将固定器添加到那些自动豆的情况要好得多。否则,您要注入所需行为的唯一方法是通过复杂的反射过程,这只会使事情变得复杂。

要明确表明设置器不在测试之外使用,您可以做几件事:

  • 将它们标记为包装私有的

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

另外,现在可能是重新审视自动化方案的好时机;如果您有很多自动接线的豆子,它可能会变得非常笨拙。

您可以在import org.mockito.MockitoAnnotations.Mock

中使用@Mock注释

@Mock private var someDao:SomeDao =_

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

相关内容

  • 没有找到相关文章