Junit测试控制台中的输出

时间:2019-10-21 16:20:39

标签: java spring-boot junit

仍然找不到失败的测试方法的原因。

Field error in object 'disclaimerFormDto' on field 'countryValue': rejected value [none]; codes [Pattern.disclaimerFormDto.countryValue,Pattern.countryValue,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [disclaimerFormDto.countryValue,countryValue]; arguments []; default message [countryValue],[Ljavax.validation.constraints.Pattern$Flag;@59374db6,^(?!(none|others)$).*$]; default message [muss auf Ausdruck "^(?!(none|others)$).*$" passen]

我的Junit测试方法如下

public static void print() {
    System.out.println("hello");
}

AssertionFailed错误是预期的:@Test public void testPrint(){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); PrintStream old = System.out; System.setOut(ps); //execute the above method obj.print(); System.out.flush(); System.setOut(old); //test method String expected = "hello" + "\n"; assertEquals(expected, baos.toString()); }

所以问题应该出在换行符上。有人知道如何解决吗?

1 个答案:

答案 0 :(得分:1)

像这样的笔试是使用模拟的好地方:

// code with Mockito
@Test
public void testPrint(){
  PrintStream mockedPrintStream = Mockito.mock(PrintStream.class);
  PrintStream old = System.out;
  System.setOut(mockedPrintStream);

  obj.print();

  Mockito.verify(mockedPrintStream).println("hello");

  System.setOut(old); // add this line when edit
}

现在,您检查的是使用param调用的方法。

有关Mockito manual中的模拟的更多信息


编辑-评论中的问题答案

PrintStream old = System.out;您需要此行,因为System.out中的代码是外部代码,在测试后,您应清除测试过程中污染的所有对象的状态。

在大多数情况下,这种清理是通过@TearDown方法进行的,或者仅是因为当@Test方法返回时,GC已删除对象。

在这种情况下,您需要手动并在测试方法中执行此操作,因为没有其他地方可以将System.out属性的状态恢复到测试前的状态。