调试使用Spock和JMockit测试的Java代码

时间:2015-02-18 21:42:08

标签: java groovy spock jmockit

我正在使用Spock为Java应用程序编写测试。该测试包括该类的JMockit MockUp。在调试测试时(使用IntelliJ),我希望能够进入Java代码。我意识到使用F5进入代码不会起作用,因为所有带有反射的Groovy魔法都在继续。不幸的是,即使我在Java代码中设置断点,它仍然不会被命中,即使它贯穿代码。

以下是要测试的代码:

public class TestClass {

    private static void initializeProperties() {
        // Code that will not run during test
    }

    public static boolean getValue() {
        return true;  // <=== BREAK POINT SET HERE WILL NEVER BE HIT
    }
}

这是测试代码:

class TestClassSpec extends Specification {

    void setup() {
        new MockUp<TestClass>() {
            @Mock
            public static void initializeProperties() {}
        }
    }

    void "run test"() {
        when:
        boolean result = TestClass.getValue()

        then:
        result == true
    }
}

测试通过,一切正常,但我无法调试Java代码。

注意:如果我不使用JMockit MockUp,我可以调试,但这是在我的生产代码中测试private static方法所必需的。

有关如何从使用JMockit的Spock测试中使调试器停止在Java代码中的任何想法?

1 个答案:

答案 0 :(得分:1)

这个答案困扰了我好几天,我搜索并寻找答案。在寻求帮助后十五分钟,我找到了答案。所以对于碰到这个问题的其他人来说,这是我的解决方案 - 这都归功于这个答案:https://stackoverflow.com/a/4852727/2601060

简而言之,当JMockit重新定义类时,将删除断点。解决方案是在测试中设置一个断点,一旦调试器在测试中停止,那么 THEN 在Java代码中设置断点。

并且非常高兴......