我想知道如何用Groovy/Spock模拟类中的一些私有变量。假设我们有这样的代码:
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中做同样的事情。什么相当于Spock中的@InjectMocks?
发布于 2018-03-16 10:27:17
这与其说是Spock问题,不如说是Groovy问题。在Groovy中,您可以只调用命名私有成员的构造函数,从而将其注入。但是这是丑陋的,你应该通过依赖注入重构可测试性,正如Tim Yates已经说过的那样。但无论如何,下面是你可以(但不应该)这样做的方法:
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发布于 2018-07-25 14:36:32
我建议在构造Engine时将其放入汽车中:
public class Car {
private final Engine engine;
public Car(final Engine engine) {
this.engine = engine
}
// ...
}然后,您可以像您的示例中那样使用JUnit来模拟引擎:
@Mock
private Engine engine;
private Car car = new Car(engine);
@Test
public void drive() {
when(engine.isState()).thenReturn(true);
car.drive();
}或者使用Spock:
private Engine engine = Mock();
private Car car = new Car(engine);
def "test drive"() {
given:
engine.isState() >> true
expect:
car.drive();
}https://stackoverflow.com/questions/49305284
复制相似问题