如何在为静态方法编写junit时从静态方法模拟实例方法调用?

时间:2017-02-28 15:38:27

标签: junit mockito powermockito

如何在为静态方法编写junit时从静态方法模拟实例方法调用?我正在为现有代码编写测试。

class A
{
   public static D methodX()
   {
      B b = new B();
      C c = b.doSomething();
   }
}

class B
{
   public C doSomething()
   {
     return C;
   }
}

class Atest
{
    @Test
    public void testMethodX()
    {
       B b =Mockito.mock(B.class);
       Mockito.when(b.doSomething()).thenReturn(new C());
       A.methodX();
       // some assertions
    }
}

2 个答案:

答案 0 :(得分:1)

另一种完全不同的方法:编写不可测试的代码。 静态是良好OO设计中的异常;第一步是简单地编写静态方法。

当你有充分的理由继续这样做时;然后以允许你合理地对它们进行单元测试的方式编写它们。

是的,可以转向PowerMock(ito)来解决这个问题,但更多理智的方法是简单地修复您的生产设计。

PowerMock(ito)框架需要一定的成本;并且可以轻松避免。

因此,我的回答是:学习如何创建可测试的代码;并且忘掉PowerMock(你可以先看看这些videos)。

答案 1 :(得分:0)

通过您的标签选择,您已经知道需要使用PowerMockito。

为了注入B类的模拟版本,我将执行以下操作:

一个班级

class A
{
   public static D methodX()
   {
      B b = getBInstance();
      C c = b.doSomething();
   }

   static B getBInstance(){
      return new B();
   }

}

测试类

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
class Atest
{
    @Test
    public void testMethodX()
    {
       B b =Mockito.mock(B.class);
       PowerMockito.stub(PowerMockito.method(A.class, "getBInstance")).toReturn(b);
       Mockito.when(b.doSomething()).thenReturn(new C());
       A.methodX();
       // some assertions
    }
}

感谢PowerMockito.stub(PowerMockito.method电话,您只需模拟getBInstance静态方法,最后调用真正的A.methodX实现。