Hallo, ich beschäftige mich gerade mit unit tests und finde keinen Ansatz für folgendes Problem:
Ein Parser soll einen Rezepttext in ein Rezept wandeln und zurückgeben.
Jetzt möchte ich jedoch den Parser testen:
Problem: recipe.setTitle() und recipe.add(), recipe.getIngredients() usw. greifen in der Implementierung in Recipe auf die Datenbank zu. Das möchte ich beim Testen nicht.
Mein Ansatz wäre: Ich muss IRecipe.getInstance(); so bauen, dass es einen Mock zurückgibt, wenn die Tests ausgeführt werden und die "normale" Implementierung wenn es sich nicht um einen Test handelt.
Wie gehe ich vor um die Abhängigkeit zur Datenbank zu isolieren?
Ein Parser soll einen Rezepttext in ein Rezept wandeln und zurückgeben.
Java:
public class Parser {
public IRecipe parse(String text) {
IRecipe recipe = IRecipe.getInstance();
recipe.setTitle("Sample Title");
recipe.add("Reis", 200, "g");
return recipe;
}
}
Java:
public interface IRecipe {
static IRecipe getInstance() {
return new Recipe(); // Recipe erbt von einer ORM-Library, alle Funktionen des Interfaces IRecipe machen Datenbank-Zugriffe in Recipe.
}
boolean saveIt();
String getTitle();
long getID();
void setTitle(String title);
void add(IRecipeIngredient recipeIngredient);
void add(String ingredientName, int amount, String unitName);
Map<IIngredient, Map<Integer, IUnit>> getIngredients();
}
Jetzt möchte ich jedoch den Parser testen:
Java:
@Test
public void theParsedRecipeHasProperIngredients() {
final List<String> ingredientNames = exampleRecipe
.getIngredients()
.keySet()
.stream()
.map(iIngredient -> iIngredient.getName())
.collect(Collectors.toList());
the(ingredientNames).shouldContain("Reis");
}
Mein Ansatz wäre: Ich muss IRecipe.getInstance(); so bauen, dass es einen Mock zurückgibt, wenn die Tests ausgeführt werden und die "normale" Implementierung wenn es sich nicht um einen Test handelt.
Wie gehe ich vor um die Abhängigkeit zur Datenbank zu isolieren?
Zuletzt bearbeitet: