如何防止超级类被jmockit嘲笑?

rdg*_*uam 5 java jmockit

给定一个类层次结构,如下所示:

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";
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试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());
    }

}
Run Code Online (Sandbox Code Playgroud)

断言失败,因为car.getName()返回null.

通过System.out.println在车辆,汽车和公共汽车的构造函数中插入's',我怀疑加载的"真实"车辆new Car(name)@Mocked Bus bus执行时会被模拟车辆替换.

有没有办法让jmockit保留真正的汽车,当汽车建成时,"实例化"?

Rog*_*rio 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);
}
Run Code Online (Sandbox Code Playgroud)