【问题标题】:How to suppress/bypass a static method in a junit test?如何在junit测试中抑制/绕过静态方法?
【发布时间】:2015-08-05 15:55:27
【问题描述】:

假设我有以下代码:

protected int returnFourtyTwo() {
    evilMethod(new Object, "");
    return 42;
}

protected static void evilMethod(Object obj, String string) {
    throw new RuntimeException("This is me being evil.");
}

我要做的是运行我的 returnFourtyTwo() 方法,而不在我的单元测试中抛出运行时异常。之前我已经能够使用 suppress() 方法绕过类构造函数,但这是我第一次不得不绕过非静态类中的静态方法(具有多个参数)。不幸的是,有关该主题的资源有点稀缺。

【问题讨论】:

  • evilMethod 应该和otherMethod 一样吗?
  • 好收获。我会编辑。
  • 使用 PowerMockito 模拟它?我不确定除了攻击字节码之外还有其他方法。

标签: java junit static mockito suppress


【解决方案1】:

正如@Dave 所提到的,您唯一的出路是模拟静态方法。您可以使用 PowerMock 做到这一点。

Mocking static methods with Mockito

【讨论】:

    【解决方案2】:

    根据您的实际方法实现的复杂程度,您可以将返回调用与抛出异常分开 - 然后测试不会抛出异常的返回调用。在很多情况下,如果像42 这样的奇怪整数也有自己的变量来解释它对应的内容,那是最好的 - 如果它总是 42,那么它是静态的和最终的。

    这就是我在这里针对您的确切情况要做的事情,但我猜这是对您的实际问题的主要简单抽象,因此您可能仍想按照之前的建议模拟它。

    static final int theAnswerToLife = 42;
    
    protected int returnFourtyTwo() {
        evilMethod(new Object, "");
        return getTheAnswerToLife();
    }
    
    protected int getTheAnswerToLife() {
        return theAnswerToLife;
    }
    
    protected static void evilMethod(Object obj, String string) {
        throw new RuntimeException("This is me being evil.");
    }
    

    【讨论】:

      【解决方案3】:

      简单来说,您可以在方法中使用@Ignore 注解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2023-02-13
        • 2019-03-25
        • 1970-01-01
        • 2012-03-30
        • 2011-06-21
        相关资源
        最近更新 更多