调试使用 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 代码中设置断点。
大家很高兴...
我正在使用 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 代码中设置断点。
大家很高兴...