我仍在学习模拟,现在我正在学习如何注入模拟。
我有一个正在测试的对象,它使用依赖于其他对象的特定方法。反过来,这些对象依赖于其他对象。我想模拟某些东西,并在执行过程中到处使用这些模拟——在方法的控制流中。
例如假设有如下类:
public class GroceryStore {
public double inventoryValue = 0.0;
private shelf = new Shelf(5);
public void takeInventory() {
for(Item item : shelf) {
inventoryValue += item.price();
}
}
}
public class Shelf extends ArrayList<Item> {
private ProductManager manager = new ProductManager();
public Shelf(int aisleNumber){
super(manager.getShelfContents(aisleNumber);
}
}
public class ProductManager {
private Apple apple;
public void setApple(Apple newApple) {
apple = newApple;
}
public Collection<Item> getShelfContents(int aisleNumber) {
return Arrays.asList(apple, apple, apple, apple, apple);
}
}
我需要编写包含以下部分的测试代码:
....
@Mock
private Apple apple;
...
when(apple.price()).thenReturn(10.0);
...
...
@InjectMocks
private GroceryStore store = new GroceryStore();
...
@Test
public void testTakeInventory() {
store.takeInventory();
assertEquals(50.0, store.inventoryValue);
}
每当调用 apple.price() 时,我都希望使用我的模拟苹果。这可能吗?
编辑:
重要说明...
包含我要模拟的对象的类确实有该对象的设置器。但是,在我正在测试的级别上,我并没有真正掌握该课程。所以,按照这个例子,虽然 ProductManager 有一个用于 Apple 的设置器,但我没有办法从 GroceryStore 对象中获取 ProductManager。