Spock:如何让不在测试中的类的静态方法返回一定的值?

时间:2019-08-12 17:39:06

标签: unit-testing groovy spock

我正在将Spock与Groovy一起使用来测试课程:

public class Animal {
    public void findAnimal() {
        findAnimalInZoo();     
    }

    private void findAnimalInZoo() {
        if (!isGoodWeather) {
            throw Exception;
        }
    }

    private boolean isGoodWeather() {
        return "good".equals(Weather.getWeather());
    }
}

Weather类:

public class Weather {
    public static String getWeather() {
        return instance.getWeather();
    }
}

现在,在方法findAnimal()的每个测试用例中,我想指定调用Weather.getWeather()时返回的值。

def "when it is good weather then expect no exception"() {
    setup:
    // What should I do for Weather.getWeather()?    
}

我该怎么办?

1 个答案:

答案 0 :(得分:3)

如果生产代码是Java,则不能使用Spock模拟来模拟静态方法。如果您的生产代码是Groovy,则可以使用以下代码:

GroovyMock(Weather, global: true)
Weather.getWeather() >> "good"

如果您坚持使用Java,则需要使用Powermock或JMockit来实现。

def "when it is good weather then expect no exception"() {
    setup:
    PowerMockito.mockStatic(Weather)
    when(Account.getWeather()).thenReturn("good")
}

参考: https://dzone.com/articles/mocking-static-methods-groovy

紧急警告 我知道您并不总是能够控制或改进您正在测试的代码,因此请忠告此建议。

当您需要花这么长时间来测试您的代码时,您的代码对您大喊,这是设计不良的结果。您的代码与Weather类紧密相关。除非您通过重写类对VM进行欺骗,否则无法将其切换到其他用途。这不仅意味着您的测试代码无法做到这一点,而且意味着您的生产代码不必要地缺乏灵活性。