有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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与powermockmockito一起测试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 classbar方法进行stub之后,bar方法被调用。 这种情况下的null指针异常是正常的,因为B类没有正确初始化

有人能解释为什么会发生这种情况,我能做些什么吗


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

    它将把所有@Mock Mock(即b)注入到

    PowerMock主要用于模拟静态方法或最终类/方法的情况