从Stubbed@SpringBean返回的java Spock+Spring存根始终返回null
我试图使用Spock围绕Spring应用程序创建一个集成测试。由于它不是Spring Boot应用程序,而且@SpringBootTest
注释严重干扰了应用程序的初始化,所以我使用的是最小配置
我特别需要在我的应用程序中存根一个返回类型为Message
的对象的服务;在实际的应用程序中,这些对象将来自第三方供应商的库,它们不能被实例化或子类化,它们的成员也没有setter,所以我唯一的选择是为它们创建Stub
。然而,在当前的配置下(我已经大大简化了测试,只是为了让大家了解要点):
@ContextConfiguration([TestSetup]) // supplies actual Spring beans including some JPA repos
class LogicSpec extends Specification {
@SpringBean
RestService restService = Stub()
@Autowired
ServiceUnderTest sut
@Autowired
SomeJPARepo repository;
def 'should do some business logic'() {
given:
Message m = new Stub() {
getStatus() >> "stubbed status"
}
restService.getMessage(_ as String) >> {
m
}
when:
sut.businessMethod()
then:
// just checking for side effects that `businessMethod` causes, no mocks being matched against
assert repository.findAll().every { it.processed == true }
}
}
}
在内部,ServiceUnderTest.businessMethod()
使用Message
对象,如下所示:
restService.getMessage(sid).getStatus() // should be "stubbed status"; always evaluates to null
然而,存根的每个方法总是返回null,无论我是否为它定义了行为。Message
对象必须从其getter返回特定值,测试才能工作。我宁愿不必将每个Message
存根声明为自己的@SpringBean
;我最终需要扩展测试以使用几个不同的Message
存根对象。我不需要mock或spies,因为RestService
方法的调用次数无关紧要,我只需要它发出适当的存根,供ServiceUnderTest
仔细研究。如果这个问题不寻常或我错过了一些明显的东西,我会道歉;我有点忘记了斯波克的生命周期概念,加上春季延长期,海水变得特别浑浊
共 (0) 个答案