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



如何在为静态方法编写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
    }
}

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

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

class

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实现。

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

当您有充分的理由仍然这样做;然后以允许您合理的单位测试的方式写它们。

是的,可以转向PowerMock(ITO)来解决此问题,但是 sane 方法是简单地修复您的生产设计。

PowerMock(ITO)框架以一定的代价出现;并且可以避免可以轻松

因此,我的答案:了解如何创建可测试代码;只是忘记了PowerMock(您可以从观看这些视频开始)。

最新更新