如何使用Mockito模拟超类中的受保护变量

gzszwxb4  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(198)

我有一个父类ClassA。

public class ClassA{
  protected EntityClass entity;
}

这是我的子类ClassB。

public class ClassB extends ClassA {
   public String someMethod(String input) {
      return entity.execute(input);
   }
}

实体类是-

public class EntityClass {
  public String execute(String input) {
     return "execute";
  }
}

在Test类中,我想测试ClassB中的someMethod(input)方法。为此,我想模拟方法调用实体。
我完全是Testng和Mockito的初学者。有人能帮助我如何做到吗?

h5qlskok

h5qlskok1#

最简单的解决方案,在测试级上再定义一个子类,也就是在测试用例自身内部,然后在构造函数中注入mock或者spy,然后你就可以执行你的测试了,例如:

public static class EntityClass {
    public String execute(String input) {
        return "execute";
    }
}

public static class ClassA {
    protected EntityClass entity;
    public ClassA(EntityClass entity) {
        this.entity = entity;
    }
    public ClassA() {
        this( new EntityClass() );
    }
}

public static class ClassB extends ClassA {

    public String someMethod(String input) {
        return entity.execute(input);
    }
}

public static class ClassBSpyed extends ClassB {
    private ClassBSpyed() {
        this.entity = Mockito.mock(EntityClass.class);
        Mockito.doReturn("SpyedResult").when(this.entity).execute(Mockito.anyString());
    }
}

@Test
public void shoulCallMocked() throws Exception {
    ClassBSpyed spy = new ClassBSpyed();
    assertEquals("SpyedResult",  spy.someMethod("LoremIpsum"));
}

相关问题