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

时间:2011-07-20 15:01:30

标签: 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";
    }

}

我正在尝试测试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时“实例化”的真实车辆?

2 个答案:

答案 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()中没有(合法的)错误吗?这些方法的代码是什么样的?