【问题标题】:Method assertEquals(Object, object) in the type Assert is not applicable for the arguments (String, Void)Assert 类型中的方法 assertEquals(Object, object) 不适用于参数 (String, Void)
【发布时间】:2018-01-09 00:00:01
【问题描述】:

我有一个静态 void 方法,它根据输入的字符串打印出一条语句,然后返回。我正在尝试使用 jUnit 来确保打印语句对于给定的输入是正确的。

我尝试使用 assertEquals(expected, System.method("input"));

我收到错误“Assert 类型中的方法 assertEquals(Object, object) 不适用于参数 (String, Void)。”我理解这个错误,但我一直无法找出如何以不同的方式编写我的测试用例,以便我可以比较两者。

【问题讨论】:

  • 如果您使用名称注释参数并且其中一个输入带有圆括号,例如@Parameters(name = "test({index})"),然后在 4.4 (Luna) 之前的 Eclipse 版本中名称会被截断。
  • 您可能会这样做的方式是创建一个输出流,然后 System 类具有类似 setOut 方法的东西,因此您的方法将直接写入流,然后您可以检查内容。我可以研究确切的方法,以后有时间再使用,或者你或其他人可以在此期间跟进。

标签: java junit


【解决方案1】:

扩展@tradeJmark 的答案;假设您的静态方法(要测试的方法)正在为某事调用System.out.print*;那么您可以通过以下方式为System“劫持”OutputStream

@Test
public void testThing() {
    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    System.setOut(new PrintStream(out));

    ClassToTest.testMethod(/* desired input */);

    final String written = out.toString();

    Assert.assertEquals(expected, written);
}

当然要注意诸如调用System.out.println(...)(而不是System.out.print(...))之类的事情会将\n(或类似的,取决于操作系统)附加到书面String等的末尾。

注意:如果您打算这样做;我建议也将其还原到某个地方。像下面这样的东西应该可以处理这个问题。

private static PrintStream ORIGINAL_OUT = null;

@BeforeClass
public static void interceptOut() {
    ORIGINAL_OUT = System.out;
}

@AfterClass
public static void revertOut() {
    System.setOut(ORIGINAL_OUT);
}

【讨论】:

  • 这很好用,谢谢。恢复它的原因是什么?
  • 通常你希望你的测试(或者在这种情况下,测试类)是独立的;即他们不会将内容泄露给其他测试类。如果您 没有 在此处还原它,但是您有另一个类将 System.out 用于其他目的(在此类测试之后运行),那么它仍将使用您的局部变量。测试在测试类的单独实例中运行,但修改静态变量会泄漏。
猜你喜欢
  • 2012-06-24
  • 2011-12-03
  • 1970-01-01
  • 2022-10-30
  • 2011-12-08
  • 2016-05-28
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多