如何在JUnit中打印错误的结果?

jus*_*rld 1 java testing junit unit-testing junit5

我正在阅读这个 JUnit教程,其中报告了这个例子:

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

public class MyTests {

    @Test
    public void multiplicationOfZeroIntegersShouldReturnZero() {
        MyClass tester = new MyClass(); // MyClass is tested

        // assert statements
        assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0));
        assertEquals("0 x 10 must be 0", 0, tester.multiply(0, 10));
        assertEquals("0 x 0 must be 0", 0, tester.multiply(0, 0));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是:如果测试失败,我如何打印(错误的)返回结果?就像是:

        assertEquals("0 x 0 must be 0, instead got"+tester.multiply(0, 0), 0, tester.multiply(0, 0));
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 5

第一件事:

从教程中提取的示例不依赖于JUnit 5的发布版本.
它可能依赖于JUnit 5 beta版本.

org.junit.jupiter.api.Assertions5.0.0版本assertEquals()中以这种方式声明您正在使用的方法:

public static void assertEquals(int expected, int actual, String message) 
Run Code Online (Sandbox Code Playgroud)

测试失败时的用户调试消息String作为最后一个参数传递.

在您的示例中,此消息作为第一个参数传递:

 assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0));
Run Code Online (Sandbox Code Playgroud)

为了记录,这个签名来自JUnit 4 org.junit.Assert

assertEquals() 定义为:

static public void assertEquals(String message, long expected, long actual)
Run Code Online (Sandbox Code Playgroud)

我想在JUnit 5的早期测试版中,开发人员依赖于JUnit 4签名.但是,他们一度决定与现有版本(新的主要版本可接受)分道扬..

现在JUnit 5发布了.因此,您应该将代码调整为此稳定版本:

assertEquals(0, tester.multiply(10, 0), "10 x 0 must be 0");
Run Code Online (Sandbox Code Playgroud)

要回答您的问题,您无需担心如何显示此消息.
如果测试失败,JUnit运行器将为您输出此消息(默认情况下在控制台和测试报告中).

例如,假设我写了一个不正确的测试方法实现:

public class MyClass {    
    public int multiply(int i, int j) {
        return 0;
    }  
}
Run Code Online (Sandbox Code Playgroud)

当我执行这个测试类时:

@Test
public void multiplicationOfZeroIntegersShouldReturnZero() {
  MyClass tester = new MyClass(); // MyClass is tested

  // assert statements
  assertEquals(0, tester.multiply(10, 0), "10 x 0 must be 0");
  assertEquals(0, tester.multiply(0, 10), "0 x 10 must be 0");
  assertEquals(0, tester.multiply(0, 0), "0 x 0 must be 0");

  assertEquals(10, tester.multiply(10, 1), "10 x 1 must be 10");
}
Run Code Online (Sandbox Code Playgroud)

最后一个断言失败10 * 1应该等于10但是我的有缺陷的实现,它返回0.
现在,当我使用Eclipse,Gradle或Maven运行此测试时,单元测试运行器会显示失败(重点是我的):

结果:

测试失败:

MyTests.multiplicationOfZeroIntegersShouldReturnZero:18

10 x 1必须是10 ==> 预期:<10>但是:<0>

测试运行:1,失败:1,错误:0,跳过:0

我完全看到所有必需的信息来理解失败的断言.
用户调试信息:10 x 1 must be 10
预期值:10
实际值:0