我正在尝试测试一个class A
,而class B
依次自动跟踪public class A {
@Autowired
private B b;
public int foo(int x, int y) {
int z = b.bar(x, y, false);
//do something with z
return z;
}
}
:
powermock
我正在使用junit与mockito
和foo
一起尝试在class A
中测试方法@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class TestA {
@Test
private void testFoo() {
B b = PowerMockito.mock(B.class);
when(b.bar(2,3,false)).thenReturn(5);
A a = PowerMockito.spy(new A());
Whitebox.setInternalState(a, "b", b);
int z = a.foo(2,3);
Assert.assertEquals(10,z);
}
}
。
NullPointerException
当我尝试运行测试时,我会从class B
中获得bar
。
使用调试器后,我发现在B class
bar
方法的{{1}}方法之后,调用了{{1}}方法。
在这种情况下,空指针异常是正常的,因为B类未正确初始化。
任何人都可以解释为什么会这样,我该怎么办呢。
答案 0 :(得分:1)
我不是PowerMockito用户,但您不需要使用@PrepareForTest(B.class)
吗?我认为注释适用于你正在嘲笑的类,它是最终的或具有静态的,而不是被测试的类。
另外,为什么在A上使用spy()
?也许您的示例代码没有公开它,但我没有看到它的用途。此外,你真的需要PowerMockito.spy()
A,或者只是使用Mockito的间谍()就足够了(也就是说都 A& B最终和/或有你需要的静力学访问/模拟/验证)?
我可以问你为什么要使用PowerMockito而不仅仅是Mockito?如果只是用Whitebox
将A中的私人B设置在内部,你可以单独使用Mockito。您只需将测试方法之外的A和B声明为:
@InjectMocks A a = new A();
@Mock B b;
它会将所有@Mock模拟(即b
)注入A。
PowerMock主要用于模拟静态方法或最终类/方法的情况。