在为静态方法编写junit时,如何从静态方法模拟实例方法调用?
如何在为静态方法编写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
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
静态方法,并最终调用realA.methodX
实现。另一种完全不同的方法:donot编写不可测试的代码。静态在良好的OO设计中是一种异常现象;第一步是mplynot写入静态方法
当您有充分的理由仍然这样做时,然后以允许您进行合理单元测试的方式编写它们
是的,可以求助于PowerMock(ito)来解决这个问题,但更明智的方法是简单地修复生产设计
PowerMock(ito)框架是以一定的成本出现的;并且可以轻松地避免
因此,我的答案是:学习如何创建可测试代码;忘记PowerMock(您可以从观看这些代码开始)