Je suis encore en train d'apprendre mockito et en ce moment j'apprends comment injecter des mocks.Mockito: injecter des mocks tout au long du flux de contrôle
J'ai un objet en test avec une méthode particulière qui dépend d'autres objets. Ces objets, à leur tour, dépendent d'autres objets. Je veux me moquer de certaines choses et faire en sorte que ces simulacres soient utilisés partout pendant l'exécution - tout au long du flux de contrôle de la méthode.
Par exemple suppose qu'il ya des classes comme:
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);
}
}
J'ai besoin d'écrire du code de test avec des portions le long des lignes de:
....
@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);
}
Chaque fois que apple.price() est appelée, je veux ma fausse pomme pour être celle utilisée. Est-ce possible?
EDIT:
Important ...
la classe qui contient l'objet que je veux railler a un setter pour cet objet. Cependant, je n'ai pas vraiment de contrôle sur cette classe au niveau que je suis en train de tester. Donc, suivant l'exemple, bien que ProductManager ait un setter pour Apple, je n'ai pas le moyen d'obtenir le ProductManager de l'objet GroceryStore.
Je pense que vous devez créer une usine pour Apple et maquette l'usine –
@Alois: quelque chose le long de ces lignes peut-être raison mais. . . Comment est-ce que j'obtiens ProductManager pour utiliser l'usine (à partir de mon test d'unité de GroceryStore)? – gMale
avec un setter dans ProductManager pour définir l'usine. Utilisez-vous un cadre DI (injection de dépendance)? ressort ou guice par exemple –