JMockit:如何在使用@Tested 注释时调试测试?
JMockit: How to debug tests when using the @Tested annotation?
问题 Debug Partial Mock in JMockit and 已经解决了这个问题,即当 class 被 JMockit 获取 redefined/instrumented 时,被测软件 (SUT) 中的断点将被忽略。
推荐的解决方案是,您应该在测试class 中添加一个额外的断点,以便在测试class.
中停止执行后重新激活SUT 中的断点。
但是,如果您在测试 class 中使用 @Tested
注释,则此解决方案不起作用,因为在这种情况下,测试 class 中的断点本身会被忽略.
这是一个例子:
package de.playground;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import mockit.Expectations;
import mockit.Injectable;
import mockit.integration.junit4.JMockit;
@RunWith(JMockit.class)
public class DebuggingWithJMockitTest {
public interface Collaborator {
String execute(String... args);
}
public static class ToTest {
private Collaborator collaborator;
public ToTest(Collaborator collaborator) {
this.collaborator = collaborator;
}
public String doSomething() {
return collaborator.execute("a", "b");
}
}
@Injectable
private Collaborator collaborator;
@Tested
private ToTest toTest;
@Test
public void testHoldOnBreakpoint() {
new Expectations() {{
collaborator.execute((String[]) any); result = "whatever";
}};
String result = toTest.doSomething(); // add breakpoint here
assertThat(result, is("whatever"));
}
}
在这种情况下,调试器 不会 在 String result = toTest.doSomething();
行停止。如果您不使用 @Tested
注释并在 @Before
方法中初始化 SUT,如下所示:
// @Tested is not used
private ToTest toTest;
@Before
public void before() {
toTest = new ToTest(collaborator);
}
断点工作得很好。
即使在测试 class 中使用 @Tested
注释,是否有任何解决方法可以调试代码?
这个错误 was brought up 在 JMockit Google 群组:
Yes, the problem is known, and already solved in JMockit 1.24.
它似乎没有记录问题。我们的团队 运行 在 JMockit 1.23 上解决了这个问题,并且确实能够通过升级到 JMockit 1.24 来解决它。
问题 Debug Partial Mock in JMockit and
但是,如果您在测试 class 中使用 @Tested
注释,则此解决方案不起作用,因为在这种情况下,测试 class 中的断点本身会被忽略.
这是一个例子:
package de.playground;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import mockit.Expectations;
import mockit.Injectable;
import mockit.integration.junit4.JMockit;
@RunWith(JMockit.class)
public class DebuggingWithJMockitTest {
public interface Collaborator {
String execute(String... args);
}
public static class ToTest {
private Collaborator collaborator;
public ToTest(Collaborator collaborator) {
this.collaborator = collaborator;
}
public String doSomething() {
return collaborator.execute("a", "b");
}
}
@Injectable
private Collaborator collaborator;
@Tested
private ToTest toTest;
@Test
public void testHoldOnBreakpoint() {
new Expectations() {{
collaborator.execute((String[]) any); result = "whatever";
}};
String result = toTest.doSomething(); // add breakpoint here
assertThat(result, is("whatever"));
}
}
在这种情况下,调试器 不会 在 String result = toTest.doSomething();
行停止。如果您不使用 @Tested
注释并在 @Before
方法中初始化 SUT,如下所示:
// @Tested is not used
private ToTest toTest;
@Before
public void before() {
toTest = new ToTest(collaborator);
}
断点工作得很好。
即使在测试 class 中使用 @Tested
注释,是否有任何解决方法可以调试代码?
这个错误 was brought up 在 JMockit Google 群组:
Yes, the problem is known, and already solved in JMockit 1.24.
它似乎没有记录问题。我们的团队 运行 在 JMockit 1.23 上解决了这个问题,并且确实能够通过升级到 JMockit 1.24 来解决它。