Powermock Mockito:我试图破坏的方法最终被调用

时间:2012-07-19 18:44:01

标签: java unit-testing junit4 mockito powermock

我正在尝试测试一个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与mockitofoo一起尝试在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类未正确初始化。

任何人都可以解释为什么会这样,我该怎么办呢。

1 个答案:

答案 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主要用于模拟静态方法或最终类/方法的情况。