我不知道如何在抽象类中填充地图(模拟)。我有这个架构:
Abstract类有一个成员Map:
abstract class Parent{
protected Map<Integer, Example> map;
protected abstract void methodForChild();
protected Object doSomthingStaff(){
Object o = map.get(...);
//...
}
}
现在我正在测试子类,我必须模拟父类来调用一些方法。如何在父模拟类中填充和使用地图?
我有一张这张地图的制定者。但是当我下一步做的时候,例如:
Map<String, Example> mapExample = new HashMap<>();
mapExample.put(putDataHere);
Parent mockParent = Mockito.mock(Parent.class);
mockParent.setMap(mapExample);
我在测试时没有填写地图。
我应该100%使用Mockito.CALLS_REAL_METHODS还是有正确的方法来解决这个问题?
答案 0 :(得分:1)
你弄错了。
在测试子类时,您肯定会在抽象父类中模拟不。
您努力测试子类,并创建&#34;普通&#34;该类的对象。就像在生产设置中一样。
换句话说; 唯一合理的测试方式应该是:
abstract class Parent {
protected abstract Map<Whatever> getMapEntries();
或类似的东西。
超越:尽量避免受保护的字段。如果您的孩子班需要提供某些&#34;输入&#34;,那么请执行类似
的操作{{1}}
子类必须实现的。
答案 1 :(得分:1)
现在我正在测试子类,我必须模拟父类 调用一些方法
我不希望你在测试子类时嘲笑父类(不确定如何做到这一点,坦率地说)我希望你模拟一个被用作类的类被测试类的一个组成部分。
请注意:
Parent mockParent = Mockito.mock(Parent.class);
mockParent.setMap(mapExample);
将不会执行任何操作,因为您在模拟上调用setMap()
,并且实际上不会执行任何操作。我怀疑那是你的问题。
答案 2 :(得分:1)
这不是一个模拟父类的好方法,因为最终,你嘲笑子类,因为子继承了父的状态和行为(属性和方法) 。这永远无法对您的代码进行良好的测试。
希望这会有所帮助。最好的问候
答案 3 :(得分:0)
你误解了抽象的东西在java中是如何工作的,它们可能不是你想要使用的东西,但是在这里我将描述它们如何工作以及如何使用它们,也许它会更好你的结果,重要的部分是理解如何abstract
和protected
在这里工作
抽象是一个未定义声明的类或接口,在定义了SOME的情况下是一个抽象类,而有些仅在此声明,只声明了childMethod并且定义了父方法< / p>
abstract class Parent{
protected Map<Integer, String> map;
protected abstract void methodForChild();
protected void doSomthingStaff(){
System.out.println("parent print");
}
}
请注意我如何在这里编写父方法,现在子项扩展父项,并定义其余的未定义变量/方法
public class Child extends Parent {
@Override
protected void methodForChild() {
System.out.println("child print");
}
}
请注意,孩子可以直接从其父级访问所有PROCTED项目,因此我可以将其作为此项进行测试
public static void main(String[] args){
Parent child = new Child(); // make the parent using the chield
child.map = new HashMap<>();
child.map.put(1, "test1");
child.map.put(2, "test2");
child.map.put(3, "test3");
for(Integer key : child.map.keySet()){
System.out.println(child.map.get(key));
child.doSomthingStaff();
child.methodForChild();
}
}
然后将打印
TEST1
父印刷
儿童印刷品
TEST2
父印刷
儿童印刷品
TEST3
父印刷
儿童印刷品
最后请注意,在main中,我循环所有Parent
类,因为这些可以使用方法而不管它们如何在子节点中定义,如果有100个不同的子类,你仍然可以循环这里所描述的全部