gpt4 book ai didi

java - 如何创建不显示在失败跟踪中的自定义 JUnit4 断言

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:39 26 4
gpt4 key购买 nike

我想向我们的代码库中添加一些自定义断言,以正确地隐藏故障跟踪。我知道如何编写一个可以静态导入的公共(public)静态方法。我知道如何重用旧断言或抛出新的 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)

最佳答案

another question about cleaning noise from stack traces 中所述,从您的 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 中过滤堆栈跟踪,而不仅仅是从其他断言中引发的堆栈跟踪。

关于java - 如何创建不显示在失败跟踪中的自定义 JUnit4 断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com