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

问题描述:

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

另一种完全不同的方法:做写未测试的代码。 静态是良好的面向对象设计中的一个异常;在第一个步骤是简单地静态方法。

而当你有很好的理由仍然这样做;然后以允许您进行合理的单元测试的方式编写它们。

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

的PowerMock(ITO)来框架在一定的成本;并且可以避免容易

因此,我的答案是:学习如何创建可测试代码;并简单地忘记PowerMock(您可以通过观看这些videos开始)。