我想向我们的代码库添加一些自定义断言,这些断言可以正确地隐藏在故障跟踪中。我知道如何编写可以静态导入的公共静态方法。我知道如何重用旧的断言或抛出新的断言AssertionError
。
我不知道怎么做是将新的自定义断言排除在故障跟踪之外。我们已经习惯了失败跟踪中的第一个命中点,它不是断言代码本身,而是调用断言的测试代码。
我知道有一个filtertrace
属性可以控制对堆栈的过滤,但是我找不到关于将新的断言添加到过滤器所必须做的任何好的文档。
我想做的一个例子:
package testassertions;
import static newassertions.MyAssertions.myAssertTrue;
import org.junit.Test;
public class ExampleTest {
@Test
public void myAssertTruePassing() { myAssertTrue(true); }
@Test
public void myAssertTrueFailing() { myAssertTrue(false); }
}
package newassertions;
import static org.junit.Assert.assertTrue;
public class MyAssertions {
public static void myAssertTrue(boolean b) {
assertTrue(b);
}
}
myAssertTrueFailing()的失败跟踪显示:
java.lang.AssertionError
at newassertions.MyAssertions.myAssertTrue(MyAssertions.java:8)
at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
我只需要显示:
java.lang.AssertionError
at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
如另一个有关清除堆栈跟踪噪声的问题所述,从IDE中过滤类可能是最简单的解决方案。实际上,您在问题中显示的堆栈跟踪已被过滤。
如果您确实想在代码中执行此操作,则可以将过滤添加到自定义断言类中,如下所示:
package newassertions;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
public class MyAssertions {
public static void myAssertTrue(boolean b) {
try {
assertTrue(b);
} catch (AssertionError e) {
filterStackTrace(e);
throw e;
}
}
private static void filterStackTrace(AssertionError error) {
StackTraceElement[] stackTrace = error.getStackTrace();
if (null != stackTrace) {
ArrayList<StackTraceElement> filteredStackTrace = new ArrayList<StackTraceElement>();
for (StackTraceElement e : stackTrace) {
if (!"newassertions.MyAssertions".equals(e.getClassName())) {
filteredStackTrace.add(e);
}
}
error.setStackTrace(filteredStackTrace.toArray(new StackTraceElement[0]));
}
}
}
在此示例中,从堆栈跟踪中过滤了封闭类'newassertions.MyAssertions'的名称(硬编码)。这种机制显然也可以从您自己创建的AssertionError过滤堆栈跟踪,而不仅仅是从其他断言中引发的堆栈跟踪。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句