在为静态方法编写 junit 时如何从静态方法模拟实例方法调用?
how to mock an instance method invocation from static method while writing junit for static method?
如何在为静态方法编写 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
class A
{
public static D methodX()
{
B b = getBInstance();
C c = b.doSomething();
}
static B getBInstance(){
return new B();
}
}
测试Class
@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
实现。
另一种完全不同的方法:不要编写不可测试的代码。 static 是好的 OO 设计中的异常;第一步是简单地 not 编写 static 方法。
当你有充分的理由仍然这样做时;然后以允许您对它们进行合理的单元测试的方式编写它们。
是的,可以求助于 PowerMock(ito) 来解决这个问题,但更 sane 的方法是简单地修复您的生产设计。
PowerMock(ito) 框架需要一定的成本;并且可以轻松避免。
因此,我的答案是:学习如何创建可测试代码;并简单地忘记 PowerMock(您可以从观看这些开始 videos)。
如何在为静态方法编写 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
class A
{
public static D methodX()
{
B b = getBInstance();
C c = b.doSomething();
}
static B getBInstance(){
return new B();
}
}
测试Class
@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
实现。
另一种完全不同的方法:不要编写不可测试的代码。 static 是好的 OO 设计中的异常;第一步是简单地 not 编写 static 方法。
当你有充分的理由仍然这样做时;然后以允许您对它们进行合理的单元测试的方式编写它们。
是的,可以求助于 PowerMock(ito) 来解决这个问题,但更 sane 的方法是简单地修复您的生产设计。
PowerMock(ito) 框架需要一定的成本;并且可以轻松避免。
因此,我的答案是:学习如何创建可测试代码;并简单地忘记 PowerMock(您可以从观看这些开始 videos)。