首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spock模拟私有变量

Spock模拟私有变量
EN

Stack Overflow用户
提问于 2018-03-16 01:03:50
回答 2查看 8.7K关注 0票数 4

我想知道如何用Groovy/Spock模拟类中的一些私有变量。假设我们有这样的代码:

代码语言:javascript
复制
public class Car {
    private Engine engine;

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

在Mockito中,我可以这样写:

代码语言:javascript
复制
@Mock
private Engine engine;

@InjectMocks
private Car car = new Car();

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

但我不知道如何在Spock中做同样的事情。什么相当于Spock中的@InjectMocks

EN

回答 2

Stack Overflow用户

发布于 2018-03-16 10:27:17

这与其说是Spock问题,不如说是Groovy问题。在Groovy中,您可以只调用命名私有成员的构造函数,从而将其注入。但是这是丑陋的,你应该通过依赖注入重构可测试性,正如Tim Yates已经说过的那样。但无论如何,下面是你可以(但不应该)这样做的方法:

代码语言:javascript
复制
package de.scrum_master.stackoverflow;

public class Engine {
  private boolean state;

  public boolean isState() {
    return state;
  }
}
代码语言:javascript
复制
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");
    }
  }
}
代码语言:javascript
复制
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,而我不知道你还想检查哪些东西。

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

代码语言:javascript
复制
driving
false state
driving
true state
票数 3
EN

Stack Overflow用户

发布于 2018-07-25 14:36:32

我建议在构造Engine时将其放入汽车中:

代码语言:javascript
复制
public class Car {
    private final Engine engine;

    public Car(final Engine engine) {
        this.engine = engine
    }

    // ...
}

然后,您可以像您的示例中那样使用JUnit来模拟引擎:

代码语言:javascript
复制
@Mock
private Engine engine;

private Car car = new Car(engine);

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

或者使用Spock:

代码语言:javascript
复制
private Engine engine = Mock();

private Car car = new Car(engine);

def "test drive"() {
    given:
    engine.isState() >> true

    expect:
    car.drive();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49305284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档