如何在编写静态方法的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开始)。