Spock 方法模拟

Spock method mocking

我有方法负责将传递给它的对象的标志更改为禁用。目的是测试该方法是否更改了该标志。我正在为此使用 spock 框架。方法在接口上调用并由 JPA 实现 module.I 找不到任何方法来模拟此方法

Interface MyService {
    public void update();
}

interface MyRepositoryService {
    //implemented by JPA module
    public void update(MyObject myObject);
}

class MyObject {
    //..
    private boolean disable;
    //..
}

规格下的模块:

class MyServiceImplementation implements MyService {
   private MyRepositoryService myRepositoryService;

   //method to be mocked
   void update(MyObject myObject){
      //...
      myRepository.update(myObject)
      //...
   }
}

不确定我是否遗漏了 smth,但只需声明一个 Mock - 如果您要测试对象之间的交互 ​​- 或者 Stub 如果您只想测试方法行为。

实例化你的测试对象调用构造函数,手动将模拟对象传递给它并编写你的测试代码。

使用 Groovy 语法举个简单的例子:

class MyServiceImplementationUnitTest extends Specification {

  def Repository repository = Mock(Repository)

  @Subject MyService service = new MyService(
      ...
      repository // the mock      
  )

  // an example guidelines for a possible test
  def "this is a test"() {
    given: "an input object"
      def inputObject = SMTH
    when: "we call update method with that object"
      service.update(inputObject)
    then: "repository's update method is called once with expected parameter"
      1 * repository.update(inputObject)
  }
}