我已经开始使用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 =_
这有效,但不建议使用。它也被弃用