【问题标题】:Passing mocked static method to another class将模拟的静态方法传递给另一个类
【发布时间】:2015-04-03 18:00:29
【问题描述】:

我在我的测试类中使用 Powermock 模拟了一个类的静态方法。我面临的问题是这个静态方法不是在我的测试类中直接调用,而是在其他一些类中调用。这是骨架:

@Test public void myTest() { 
    PowerMockito.mockStatic(MyClassWithStaticMethod.class);
    PowerMockito.when(MyClassWithStaticMethod.staticMethod()).thenReturn("...");
    List<String> details = MyHelperClass.getDetails();
    ...
    ...
}

现在 MyHelperClass.getDetails 调用需要模拟的方法,因为它依赖于服务。

MyHelperClass.java

public static List<String> getDetails() {
    ...
    ...
    MyObj obj = MyClassWithStaticMethod.staticMethod(); //This needs to return mocked value
    ...
    ...
}

有没有办法将模拟对象传递给辅助类? PowerMockito.mockStatic 返回 void,因为 PowerMockito.mock 不模拟静态方法。所以我无法弄清楚如何将模拟对象传递给辅助类 getDetails() 方法。

【问题讨论】:

    标签: java unit-testing mockito powermock


    【解决方案1】:

    PowerMock 并不能真正实现您想要实现的目标。还有另一个模拟框架,它可以通过检测字节码来模拟几乎所有内容 - JMockit

    至于您的问题 - 也许that 会有所帮助

    【讨论】:

    • 非常感谢!起初我对使用 JMockit 犹豫不决,因为 mockito 已经被使用,我想通过将 PowerMock 与 mockito 一起使用来找出解决方案。我在让 JMockit 运行时遇到了一些问题 - 必须将我的 Junit 升级到 4.12,因为 JMockit 只支持 JUnit 4.5+(这是一个优点,但我希望我们代码中的 Junit 4.4 测试没有 4.12 不支持的东西)。但是,与JMockit这样的美女成为朋友,所有的麻烦都是完全值得的! :)
    • 使用 JMockit 应该更容易编写测试,但使用 PowerMock 也应该可以正常工作。我想知道OP是否忘记在测试类上使用@PrepareForTest
    【解决方案2】:

    只是关于静态方法的一个简单说明——因为这种方法更难存根,而且存根它们可能会影响其他测试,我建议为它们添加单元测试并依赖这些测试,而不是尝试确保方法被调用。

    我提倡这种方法的原因是静态方法应该只包含实用方法,一旦测试就可以依赖这些方法。而且检查方法调用总是会引入代码和单元测试之间的耦合,导致在考虑重构时令人头疼,因为应用程序代码重构会导致大量单元测试需要更改。

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2018-11-16
      • 1970-01-01
      • 2013-05-03
      • 2019-08-11
      相关资源
      最近更新 更多