仍然找不到失败的测试方法的原因。
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());
}
所以问题应该出在换行符上。有人知道如何解决吗?
答案 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
属性的状态恢复到测试前的状态。