Я все еще участвую в mockito, и сейчас я учу, как вводить насмешки.Mockito: инжекционные измельчения во всем потоке управления
У меня есть объект под конкретным методом, который зависит от других объектов. Эти объекты, в свою очередь, зависят от других объектов. Я хочу издеваться над определенными вещами и использовать эти приманки везде во время исполнения - во всем потоке управления методом.
Например предположим, есть классы, такие как:
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() вызывается, я хочу мое макетное яблоко, которое будет использоваться. Это возможно?
EDIT:
Важное примечание ...
класс, который содержит объект, я хочу, чтобы дразнить действительно есть сеттер для этого объекта. Тем не менее, у меня нет справки для этого класса на уровне, который я тестирую. Итак, следуя примеру, хотя ProductManager имеет набор для Apple, у меня нет способа получить ProductManager из объекта GroceryStore.
Я думаю, вы должны создать фабрику для Apple, а затем издеваться завод –
@Alois: что-то вдоль этих линий может быть правильным, но. , , как я могу заставить ProductManager использовать фабрику (из моего модульного теста GroceryStore)? – gMale
с установщиком в ProductManager для определения фабрики. Используете ли вы какие-либо рамки DI (зависимость)? весна или гусь, например –