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

Debugging Java code tested with Spock and JMockit

我正在使用 Spock 为 Java 应用程序编写测试。该测试包括用于 class 的 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 代码中停止的任何想法?

这个答案困扰了我好几天了,找啊找啊找答案。发帖求助十五分钟后,我找到了答案。因此,对于遇到此问题的任何其他人,这是我的解决方案 - 这都归功于这个答案:

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

大家很高兴...