【问题标题】:Mock a single static method using PowerMock and TestNG使用 PowerMock 和 TestNG 模拟单个静态方法
【发布时间】:2013-12-05 10:56:39
【问题描述】:
class StaticClass {
  public static String a(){ return "a"; }
  public static String ab(){ return a()+"b"; }
}

我想模拟 StaticClass::a 以便它返回 "x" 并调用 StaticClass.ab() 导致 "xb"...

我发现在 PowerMock 和 TestNG 中很难...


我现在正在测试的确切代码:

class StaticClass {
    public static String A() {
        System.out.println("Called A");
        throw new IllegalStateException("SHOULD BE MOCKED AWAY!");
    }

    public static String B() {
        System.out.println("Called B");
        return A() + "B";
    }
}

@PrepareForTest({StaticClass.class})
public class StaticClassTest extends PowerMockTestCase {

    @Test
    public void testAB() throws Exception {
        PowerMockito.spy(StaticClass.class);
        BDDMockito.given(StaticClass.A()).willReturn("A");
        assertEquals("AB", StaticClass.B()); // IllegalStateEx is still thrown :-/
    }

}

我有 Maven 依赖项:

<artifactId>powermock-module-testng</artifactId>
and
<artifactId>powermock-api-mockito</artifactId>

【问题讨论】:

  • 你有没有尝试像PowerMock documentation描述的那样做?
  • @sigito 是的!我将更新示例以向您展示我需要模拟的代码
  • 你一定是丢失了mockStatic方法调用。
  • @sigito 看,我不想模拟整个类,而只是一个静态方法...

标签: java mocking testng powermock


【解决方案1】:

为什么不试试类似的东西:

PowerMockito.mockStatic(StaticClass.class);
Mockito.when(StaticClass.a()).thenReturn("x");
Mockito.when(StaticClass.ab()).thenCallRealMethod();

【讨论】:

  • 他使用的是 TestNG 而不是 Mockito。
  • 如果该方法什么都不返回(void),这仍然可能吗?我的静态类有 20 个静态方法,我只想模拟其中一种方法怎么样?
  • @Marquez 是的,仍然可以使用 void 方法。如果 ab() 是一个不返回任何内容的 void 方法,它可能是这样的:PowerMockito.when(StaticClass.class, "ab").thenCallRealMethod();
【解决方案2】:

我认为这可以通过 Partial Mock 来完成。

PowerMock.mockStaticPartial(Mocked.class, "methodToBeMocked");

这可能会有所帮助:http://avricot.com/blog/index.php?post/2011/01/25/powermock-%3A-mocking-a-private-static-method-on-a-class

【讨论】:

  • 这听起来不错。不过老实说,我非常不喜欢通过字符串名称指定方法......如果没有一个好的 IDE,这将是一个可怕的事情。有什么方法可以通过编写实际的 Java 代码来模拟(换句话说:像普通方法一样模拟)?
  • 这是一个很好的观点。我认为您也可以通过间谍来完成此任务。见stackoverflow.com/questions/4860475/…
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多