如何创建未在故障跟踪中显示的自定义JUnit4断言

can*_*nge 8 java junit4 assertion java-5

我想在我们的代码库中添加一些自定义断言,以正确隐藏故障跟踪.我知道如何编写一个可以静态导入的公共静态方法.我知道如何重用旧的断言或抛出新的断言AssertionError.

我无法弄清楚如何做的是将新的自定义断言保留在Failure Trace之外.我们已经习惯了故障跟踪中的第一个命中,而不是断言代码本身,而是调用断言的测试代码.

我知道有一个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); }
}
Run Code Online (Sandbox Code Playgroud)
package newassertions;

import static org.junit.Assert.assertTrue;

public class MyAssertions {

    public static void myAssertTrue(boolean b) {
        assertTrue(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

myAssertTrueFailing()的失败跟踪显示:

java.lang.AssertionError
    at newassertions.MyAssertions.myAssertTrue(MyAssertions.java:8)
    at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
Run Code Online (Sandbox Code Playgroud)

我需要它只显示:

java.lang.AssertionError
    at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
Run Code Online (Sandbox Code Playgroud)

gar*_*gar 5

另一个有关清除堆栈跟踪噪声的问题所述,从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]));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,从堆栈跟踪中过滤了封闭类'newassertions.MyAssertions'的名称(硬编码)。这种机制显然也可以从您自己创建的AssertionError过滤堆栈跟踪,而不仅仅是从其他断言中引发的堆栈跟踪。