gpt4 book ai didi

java - 如何将 JUnit 输出分配给字符串?

转载 作者:行者123 更新时间:2023-12-02 05:51:37 25 4
gpt4 key购买 nike

当单元测试失败时,我想在问题跟踪软件中创建错误报告。这意味着我需要将测试失败时通常打印到 IDE 控制台的内容保存为字符串。到目前为止,我有以下代码:

@Rule
public ErrorCollector collector = new ErrorCollector();
...

@Test
public void testFailedUnitTest() {
collector.checkThat(3, equalTo(5));
}

它将以下内容输出到控制台。我想将其放入 String 中,而不是将其输出到 IDE 的控制台:

java.lang.AssertionError: 
Expected: <5>
but: was <3>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.junit.Assert.assertThat(Assert.java:865)
...

我已经尝试过:

  1. 用 try/catch block 包围它并使用 e.get...但是它没有捕获 java.lang.AssertionError。 catch block 中的代码甚至没有执行。我想那是因为我的收集器正在等待抛出异常testFailedUnitTest() 完成抛出错误,以便它可以继续执行失败的测试。

  2. 使用 try/catch block 围绕正常的非收集器 JUnit 测试。

  3. 在所有测试完成后,在我的tearDown()中获取输出完全的。但没有像 public String[] 这样的方法the ErrorCollector JavaDoc 中的 getJUnitFailures()所以但这不起作用。

  4. 涉及编辑 pom.xml 中某些内容的各种方法,例如 setting the redirectTestOutputToFile element to true但它们有与 2) 相同的问题,不幸的是一些遗留代码不使用 Maven。但是,Maven 特定的方法是可以接受的。

我亲自与某人交谈,他说我也许能够使用 the Logger class 将每个测试的输出记录到文件中并将每个文件作为字符串读取。他承认这是一次草率的黑客行为,可能会干扰我们的其他日志记录设施。

这是否有效?如果有效,这是最好的方法吗?

提前谢谢您。 :)

最佳答案

看起来像 TestWatcher可以做你想做的事。

<小时/>

示例

import java.io.PrintWriter;
import java.io.StringWriter;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class FailedTestCapturer {

@SuppressWarnings("null")
private static int throwNPE() {
String x = null;
return x.length();
}

private String exception;
@Rule
public final TestRule watchman = new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
exception = writer.toString();
System.out.println("Captured exception! --> " + exception);
}
};

@Test
public void failingTest() {
throwNPE();
}
}

输出

Captured exception! --> java.lang.NullPointerException
at FailedTestCapturer.throwNPE(FailedTestCapturer.java:15)
at FailedTestCapturer.failingTest(FailedTestCapturer.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

关于java - 如何将 JUnit 输出分配给字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486069/

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