我应该如何在抽象模拟类中填充Map?

时间:2017-03-28 13:05:15

标签: java unit-testing mockito

我不知道如何在抽象类中填充地图(模拟)。我有这个架构:

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还是有正确的方法来解决这个问题?

4 个答案:

答案 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中是如何工作的,它们可能不是你想要使用的东西,但是在这里我将描述它们如何工作以及如何使用它们,也许它会更好你的结果,重要的部分是理解如何abstractprotected在这里工作

抽象是一个未定义声明的类或接口,在定义了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个不同的子类,你仍然可以循环这里所描述的全部