这是我的情况,我有一个A类,它有一个成员字段b。我想测试并在单元测试中,我嘲笑A并且还需要调用方法f()来调用b的f()。但是模拟A中的b变量是null,因此会抛出NPE,而我没有b的get / set方法,所以有没有办法模拟b?感谢
public static class B{
public void f() {
}
}
public static class A {
B b;
public void f() {
b.f();
}
}
答案 0 :(得分:0)
如果你想在测试中模拟A的b
属性,你已经给了b
属性默认(包私有)访问权限,所以只要你的测试在相同的包你可以直接替换b属性。
@Test
public void testB() {
A underTest = new A();
B mockedB = Mockito.mock(B.class);
underTest.b = mockedB;
underTest.f();
Mockito.verify(mockedB).f();
}
顺便说一下,我个人不喜欢使用包私有访问来使用成员属性进行测试,而是建议使用像Guice或Spring DI这样的依赖注入框架来进行构造函数注入。
但是你已经描述过你已经嘲笑了A,我已经想过如果是这种情况,A的f()方法什么都不做 - 你不会得到一个空指针异常作为调用mock将替换真正的b属性,只是一个无效的void方法。如果是这种情况,请您提供更多详细信息吗?