groovy - Spock 模拟私有(private)变量

标签 groovy mockito spock

我想知道如何使用 Groovy/Spock 在类中模拟一些私有(private)变量。
假设我们有这个代码:

public class Car {
    private Engine engine;

    public void drive(){
        System.out.println("test");
        if (engine.isState()) {
            // Do something
        } else {
           // Do something
        }
    }
}

在 Mockito 我可以写:
@Mock
private Engine engine;

@InjectMocks
private Car car = new Car();

@Test
public void drive() {
    when(engine.isState()).thenReturn(true);
    car.drive();
}

但我不知道如何在 Spock 中做同样的事情。相当于@InjectMocks在史波克?

最佳答案

这与其说是 Spock 问题,不如说是 Groovy 问题。在 Groovy 中,您只需调用命名私有(private)成员的构造函数,从而注入(inject)它。但这很丑陋,您应该像 Tim Yates 已经说过的那样,通过依赖注入(inject)来重构可测试性。但就其值(value)而言,以下是您可以(但不应该)这样做的方法:

package de.scrum_master.stackoverflow;

public class Engine {
  private boolean state;

  public boolean isState() {
    return state;
  }
}

package de.scrum_master.stackoverflow;

public class Car {
  private Engine engine;

  public void drive(){
    System.out.println("driving");
    if(engine.isState()) {
      System.out.println("true state");
    } else {
      System.out.println("false state");
    }
  }
}

package de.scrum_master.stackoverflow

import spock.lang.Specification

class CarTest extends Specification {
  def "Default engine state"() {
    given:
    def engine = Mock(Engine)
    def car = new Car(engine: engine)

    when:
    car.drive()

    then:
    true
  }

  def "Changed engine state"() {
    given:
    def engine = Mock(Engine) {
      isState() >> true
    }
    def car = new Car(engine: engine)

    when:
    car.drive()

    then:
    true
  }
}

顺便说一句,then: true是因为你的方法返回 void我不知道你还想检查哪些其他东西。

测试为绿色,控制台日志如下所示:

driving
false state
driving
true state

关于groovy - Spock 模拟私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49305284/

相关文章:

groovy - Groovy 中的 String 没有此类属性错误

java - 为任何整数输入参数设置模拟返回值

unit-testing - 单元测试src/groovy类文件

groovy - ElasticSearch:在 groovy 脚本中访问文档嵌套值

date - Groovy - 将时间戳字符串转换为以毫秒为单位的纪元时间

java - 无法模拟通用对象创建

chalice 2.4.4 : services does not inject: integration test

unit-testing - 如何在Grails 3中填充域类以进行单元测试

grails - groovy 中的递归(grails)

java - "Invalid use of argument matchers"但我只使用匹配器