我已经开始使用ScalaTest来测试我的Java代码了,我喜欢它(我已经阅读了#34;在Scala中测试"本书)。
最近,我一直在尝试测试一些包含标记为private
和@Autowired
的字段的java Spring代码。这些字段没有setter方法。
我意识到我可以使用注释@InjectMocks
和@Mock
轻松地使用JUnit + Mockito测试它们,但是,我想使用ScalaTest和模拟框架(例如Mockito或ScalaMock)测试它们)。
我的问题:可以使用Scalatest + Mockito模拟私有字段,或者这些框架要求我的java类为我的public
+ private
字段定义了@Autowired
setter方法?
答案 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 =_
这有效但不建议使用。它也被弃用了