【问题标题】:Debugging Java code tested with Spock and JMockit调试用 Spock 和 JMockit 测试的 Java 代码
【发布时间】:2015-02-18 21:42:08
【问题描述】:

我正在使用 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 代码中的任何想法?

【问题讨论】:

    标签: java groovy spock jmockit


    【解决方案1】:

    这个答案困扰了我好几天,一直在寻找答案。发帖求助十五分钟后,我找到了答案。因此,对于遇到此问题的其他任何人,这是我的解决方案 - 这一切都归功于这个答案:https://stackoverflow.com/a/4852727/2601060

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

    还有很多欢喜...

    【讨论】:

    • 不幸的是,这个解决方案对我不起作用。我正在使用 JMockit 1.23、jdk 1.8 和 Eclipse Mars (4.5.1),甚至在测试方法的 JUnit 测试类中设置断点并不能说服调试器停止:(
    • 现在我发现了与上述测试的不同之处。我在成员方法上使用注释@Tested。如果我通过在 @Before 方法中手动创建 SUT 来替换它,则测试类中的断点工作正常。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多