Mockito-如果超类包含名称和类型与子类相同的字段,则如何注入模拟

阿卜杜勒·法塔赫:

是否可以在与子类具有相同名称和类型的超类字段中注入模拟。

在我的情况下,我有一个控制器类

abstract class BaseController {
    protected AccessManager accessManager;
}

它由以下类扩展:

class ApiController<T> extends BaseController {

}

最后,一个更专业的控制器将其扩展为:

class PersonController extends ApiController<Person> {
     private AccessManager accessManager;
}

我正在为此编写单元测试,PersonController并且在测试时,其某些方法称为BaseController的方法,委托将其称为的protected成员对象,该对象始终为null

我尝试使用@InjectMocksReflectionTestUtils.setField来设置的受保护字段BaseController,但是这些方法最终只能在PersonController上设置该字段,因为它们的名称和类型相同。

我花了很多时间在此问题上,但无法解决。请帮忙。谢谢

伊凡·莱玛(Ivan Lymar):

正如@strelok提到的那样,您可以使用带有以下签名的方法

public static void setField(@Nullable Object targetObject, @Nullable Class<?> targetClass, @Nullable String name, @Nullable Object value, @Nullable Class<?> type)

它要求你现场设置,如在指定哪些类使用ParentChild

public class Parent {
    private String name;

    public String getName() {
        return name;
    }
}

public class Child extends Parent {
    private String name;

    public String getName() {
        return name;
    }

    public void printNames() {
        System.out.println("I'm " + this.name);
        System.out.println("My father is " + super.getName());
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        ReflectionTestUtils.setField(child,Parent.class, "name", "fatah",String.class);
        ReflectionTestUtils.setField(child,Child.class, "name", "abdul",String.class);
        child.printNames();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章