JavaPowerMockMockito:我试图stubb的方法最终被调用
我试图测试一个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;
}
}
我正在使用junit与powermock
和mockito
一起测试class A
中的foo
方法
@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);
}
}
当我尝试运行测试时,我从class B
中得到一个NullPointerException
。
在使用调试器之后,我发现在对B class
的bar
方法进行stub之后,bar
方法被调用。
这种情况下的null指针异常是正常的,因为B类没有正确初始化
有人能解释为什么会发生这种情况,我能做些什么吗
# 1 楼答案
我不是PowerMockito用户,但您不需要使用
@PrepareForTest(B.class)
吗?我认为注释是针对您正在模拟的类的,它是最终的或具有静态的,而不是针对被测试的类另外,您为什么要在服务器上使用
spy()
?也许您的示例代码没有公开它,但我看不出它的用途。此外,对于A,您真的需要PowerMockito.spy()
,还是仅仅使用Mockito的spy()就足够了(即,A&B final和/或有需要访问/模拟/验证的静态数据)我可以问一下,为什么您使用PowerMockito而不仅仅是Mockito?如果只是用
Whitebox
在A内部设置私有B,那么可以单独用Mockito来实现。您只需将测试方法之外的A和B声明为:它将把所有@Mock Mock(即
b
)注入到PowerMock主要用于模拟静态方法或最终类/方法的情况