5

次のようなクラス階層があるとします。

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 クラスをテストしようとしています。しかし、車もたまたまバスを利用しています。したがって、私のテストでは、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 を返すため、アサートは失敗します。

Vehicle、Car、および Bus のコンストラクターに 's を挿入することによりSystem.out.println、ロードされる「実際の」Vehicle が、new Car(name)後で の実行時にモックされた Vehicle に置き換えられるのではないかと疑ってい@Mocked Bus busます。

車が構築されたときに「インスタンス化」された実際の車両を保存するjmockitの方法はありますか?

4

2 に答える 2

1

2 つの解決策があります。

@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);
}
于 2011-07-20T19:42:55.720 に答える
0

車に「関連付けられた」車両はありません-車車両です。関連付けと継承は同じではありません。したがって、「モック」された車両を搭載した車を所有することはできません。この文は、の場合は意味がありませんCar extends Vehicle

車のコンストラクターまたはのどちらにも(正当な)バグがないことを確認しますかgetName()?これらのメソッドのコードはどのように見えますか?

于 2011-07-20T15:05:49.980 に答える