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

调试使用Spock和JMockit测试的Java代码,java,groovy,spock,jmockit,Java,Groovy,Spock,Jmockit,我正在使用Spock为Java应用程序编写测试。该测试包括类的JMockit模型。在调试测试(使用IntelliJ)时,我希望能够逐步了解Java代码。我意识到使用F5单步执行代码是行不通的,因为Groovy的反射魔法一直在发挥作用。不幸的是,即使我在Java代码中设置了断点,它仍然不会被命中,即使它在代码中运行 下面是要测试的代码: public class TestClass { private static void initializeProperties() {

我正在使用Spock为Java应用程序编写测试。该测试包括类的JMockit
模型。在调试测试(使用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
    }
}
公共类TestClass{
私有静态void initializeProperties(){
//测试期间不会运行的代码
}
公共静态布尔getValue(){

return true;//这个答案困扰了我好几天,我一直在寻找答案。在发布帮助信息15分钟后,我找到了答案。因此,对于遇到这个问题的其他人,我的解决方案是——这都要感谢这个答案:

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


令人高兴的是…

不幸的是,这个解决方案不适合我。我正在使用JMockit 1.23、jdk 1.8和Eclipse Mars(4.5.1),甚至在测试方法的JUnit测试类中设置断点也不能说服调试器停止:(现在我发现了与上述测试的区别。我正在成员方法上使用注释
@Tested
。如果我通过在
@Before
方法中手动创建SUT来替换此注释,则测试类中的断点工作正常。
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
    }
}