调试使用Spock和JMockit测试的Java代码
我正在使用Spock为Java应用程序编写测试。该测试包括类的JMockit调试使用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() {
模型。在调试测试(使用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
}
}