有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从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) 个答案