2

我正在尝试测试 aclass A反过来自动装配 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 与 and 一起使用powermockmockito尝试fooclass 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. 使用调试器后,我发现在 stub 的bar方法之后B class,该bar方法被调用。这种情况下出现空指针异常是正常的,因为B类没有正确初始化。

谁能解释为什么会发生这种情况以及我能做些什么。

4

1 回答 1

1

我不是 PowerMockito 用户,但你不需要使用@PrepareForTest(B.class)吗?我认为注释适用于您正在模拟的类,它是最终的或具有静态的,而不是用于被测类。

另外,你为什么spy()在A上使用?也许您的示例代码没有公开它,但我看不到它的用途。此外,您真的需要PowerMockito.spy()A,还是仅仅使用 Mockito 的 spy() 就足够了(即,A 和 B 都是最终的和/或具有您需要访问/模拟/验证的静态数据)?

我能问一下你为什么使用 PowerMockito 而不仅仅是 Mockito 吗?如果只是在 A 内部设置私有 B Whitebox,则可以单独使用 Mockito 来做到这一点。您只需在测试方法之外将 A 和 B 声明为:

@InjectMocks A a = new A();
@Mock B b;

它会将所有@Mock 模拟(即,b)注入A。

PowerMock 在模拟静态方法或最终类/方法的情况下最有用。

于 2012-07-19T19:03:19.230 回答