Abd*_*tah 2 java junit spring unit-testing mockito
是否可以在与子类具有相同名称和类型的超类字段中注入模拟。
在我的情况下,我有一个控制器类
abstract class BaseController {
protected AccessManager accessManager;
}
Run Code Online (Sandbox Code Playgroud)
它由如下类扩展:
class ApiController<T> extends BaseController {
}
Run Code Online (Sandbox Code Playgroud)
最后,一个更专业的控制器像这样扩展它:
class PersonController extends ApiController<Person> {
private AccessManager accessManager;
}
Run Code Online (Sandbox Code Playgroud)
我正在为PersonController它编写单元测试,并在测试它时,它的一些方法调用BaseController的方法,委托调用它的protected成员对象,它总是null.
我曾尝试使用@InjectMocks和用于ReflectionTestUtils.setField设置 的受保护字段BaseController,但这些方法最终只会在PersonController类上设置字段,因为它们的名称和类型相同。
我在这方面花了很多时间,但无法解决。请帮忙。谢谢
正如@strelok 提到的,您可以使用具有以下签名的方法
public static void setField(@Nullable Object targetObject, @Nullable Class<?> targetClass, @Nullable String name, @Nullable Object value, @Nullable Class<?> type)
Run Code Online (Sandbox Code Playgroud)
它要求您指定在字段设置期间使用哪个类,例如Parent或Child
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2663 次 |
| 最近记录: |