如何在调用类的委托上测试交互?

问题描述 投票:0回答:1

我有下面显示的以下类,旧版代码。我要实现的目标是确保通过传递的用户数据调用委托方法processUser。其次,我还想确保调用传入的Registration对象的doRegister。我的代表人的attemot如下所示,但测试未通过,因为调用太少。我正在使用Groovy spock来测试版本1.2

class Invoker {
    Delegate delegate;

    Invoker(Delegate delegate) {
        this.delegate = delegate;
    }

    void invoke(UserData user) {
        delegate.processUser(user);
    }
}
class Delegate {
    private RegistrationService service;

    Delegate (RegistrationService r) {
        this.service = r;
    }

    void processUser(UserData data) {
        service.doRegistration(data);
    }
}
class DelegateSpec extends Specification {
     Delegate delegate
     RegistrationService registration
     Invoker invoker

     def setup() {
         registration = Mock()
         delegate = new Delegate(registration)
         Invoker invoker = new Invoker(delegate)
     }

     def "Invoker should invoke delegate passed to it"() {
         given:
         UserData u = ....
         when:
         invoker.invoke(u)
         then:
         1* delegate.processUser(u) 
    }
}
unit-testing groovy spock
1个回答
0
投票

首先,我提供一组完全一致的类,以便能够编译应用程序代码:

package de.scrum_master.stackoverflow.q59366025;

public class UserData {}
package de.scrum_master.stackoverflow.q59366025;

public class RegistrationService {
  public void doRegistration(UserData data) {}
}
package de.scrum_master.stackoverflow.q59366025;

class Delegate {
  private RegistrationService service;

  Delegate (RegistrationService r) {
    this.service = r;
  }

  void processUser(UserData data) {
    service.doRegistration(data);
  }
}
package de.scrum_master.stackoverflow.q59366025;

class Invoker {
  Delegate delegate;

  Invoker(Delegate delegate) {
    this.delegate = delegate;
  }

  void invoke(UserData user) {
    delegate.processUser(user);
  }
}

现在,对于您的测试,您使其变得比必要的更加复杂,并且还存在逻辑错误:

  • 如果Delegate不是模拟或间谍,则无法在其上检查类似1 *的交互。
  • 因此只需使其成为模拟,然后您就不再需要注入其RegistrationService依赖项-这是创建模拟的全部要点。
package de.scrum_master.stackoverflow.q59366025

import spock.lang.Specification

class DelegateSpec extends Specification {
  def delegate = Mock(Delegate)
  def invoker = new Invoker(delegate)

  def "Invoker should invoke delegate passed to it"() {
    given:
    def userData = new UserData()
    when:
    invoker.invoke(userData)
    then:
    1 * delegate.processUser(userData)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.