给定一个如下所示的类层次结构:
public class Vehicle {
private String name;
public Vehicle(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Car extends Vehicle {
public Car(String name) {
super(name);
}
public String drive() {
return "driving the car";
}
public String boardBus() {
Bus bus = new Bus("bus to cut off");
return bus.board();
}
}
public class Bus extends Vehicle {
public Bus(String name) {
super(name);
}
public String board() {
return "boarding the bus";
}
}
我正在尝试测试Car类。但是,Car也碰巧使用了Bus。所以,在我的测试中,我正试图模仿巴士。我的测试代码如下所示:
import static org.junit.Assert.assertEquals;
import mockit.Mocked;
import mockit.NonStrictExpectations;
import org.junit.Test;
public class CarTest {
@Test
public void testCar() {
final String name = "I am a car";
final Car car = new Car(name);
new NonStrictExpectations() {
@Mocked Bus bus;
{
bus.board(); result = "test bus boarding";
}
};
assertEquals("I am a car", car.getName());
}
}
断言失败,因为car.getName()
返回null。
通过在车辆,汽车和公共汽车的构造函数中插入System.out.println
,我怀疑new Car(name)
加载的“真实”车辆后来被模拟车辆取代@Mocked Bus bus
已执行。
有没有办法让jmockit保留构建Car时“实例化”的真实车辆?
答案 0 :(得分:1)
我看到两个解决方案:
@Test
public void boardBus_usingInstanceSpecificMockingForNewedInstances()
{
new Expectations() {
@Capturing @Injectable Bus bus;
{
bus.board(); result = "mocked";
}
};
String result = new Car("myCar").boardBus();
assertEquals("mocked", result);
}
@Test
public void boardBus_usingPartialMocking()
{
final Bus bus = new Bus("");
new Expectations(bus) {{ bus.board(); result = "mocked"; }};
String result = new Car("myCar").boardBus();
assertEquals("mocked", result);
}
答案 1 :(得分:0)
没有车辆与汽车“关联” - 汽车是车辆。关联和继承是不一样的。因此,不可能有一辆带有“模拟”车辆的汽车 - 这句话在Car extends Vehicle
时毫无意义。
你确定Car的构造函数或getName()
中没有(合法的)错误吗?这些方法的代码是什么样的?