gpt4 book ai didi

java - JMockit:模拟父类和子类

转载 作者:行者123 更新时间:2023-12-01 11:10:58 25 4
gpt4 key购买 nike

这是我试图实现的结果的稍微简化版本,但我认为它说明了问题。

假设我有以下两个类,其中一个是另一个的后代:

public class Vehicle {

protected String name;

{
name = "Vehicle";
}

public String getName() {
return name;
}

}

public class Car extends Vehicle {

{
name = "Car";
}

}

我也有这个测试代码:

public class VehiclesTest {

@Test
public void checkVehicles(@Mocked final Vehicle vehicleMock,
@Mocked final Car carMock) {
new Expectations() {
{
vehicleMock.getName(); result = "mocked vehicle";

carMock.getName(); result = "mocked car";
}
};

Vehicle aVehicle = new Vehicle();
System.out.println("Starting a " + aVehicle.getName());

Vehicle aCar = new Car();
System.out.println("Starting a " + aCar.getName());
}
}

想要在控制台输出上看到的是这样的:

Starting a mocked vehicleStarting a mocked car

但是,实际输出如下所示:

Starting a mocked carStarting a mocked car

我是 JMockit 的新手,所以我认为我知道为什么会发生这种情况(这是因为 JMockit 会模拟模拟的所有祖先类,直到类层次结构,不包括java.lang.Object)。

我如何设定我的期望以获得我想要的结果?是否可以对同一层次结构中不同类的多个模拟设置期望(即一个类是另一个类的后代)?

最佳答案

以下测试将起作用:

@Test
public void checkVehicles(@Mocked Vehicle anyCarOrVehicle) {
new Expectations() {{
new Vehicle().getName(); result = "mocked vehicle";
new Car().getName(); result = "mocked car";
}};

assertEquals("mocked vehicle", new Vehicle().getName());
assertEquals("mocked car", new Car().getName());
}

诚然,在这种情况下 API 并不明显。一如既往,最好的办法就是尽可能避免 mock 。特别是,模拟旨在用于模拟和验证行为,而不是状态。因此,如果您 mock “getters”,则这是糟糕的测试方法的强烈信号。

关于java - JMockit:模拟父类和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32379202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com