我想知道如何使用 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/