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

在为静态方法编写junit时,如何从静态方法模拟实例方法调用?,junit,mockito,powermockito,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 t

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

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
静态方法,并最终调用real
A.methodX
实现。

另一种完全不同的方法:donot编写不可测试的代码。静态在良好的OO设计中是一种异常现象;第一步是mplynot写入静态方法

当您有充分的理由仍然这样做时,然后以允许您进行合理单元测试的方式编写它们

是的,可以求助于PowerMock(ito)来解决这个问题,但更明智的方法是简单地修复生产设计

PowerMock(ito)框架是以一定的成本出现的;并且可以轻松地避免

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