如何让Mockito在测试失败时缩短字节数组的输出内容?
解决Mockito测试失败时字节数组输出冗长的问题
要缩短Mockito在测试失败时打印的字节数组内容,核心是自定义匹配器的错误描述逻辑,通过重写匹配器的describeMismatch方法来控制实际参数的显示格式。
具体实现步骤
假设你的anyByteArray自定义匹配器原本是这样的:
import org.mockito.ArgumentMatcher; import static org.mockito.Mockito.argThat; public class ByteArrayMatchers { public static byte[] anyByteArray() { return argThat(new ArgumentMatcher<byte[]>() { @Override public boolean matches(Object argument) { return argument instanceof byte[]; } }); } }
修改它,添加describeTo和describeMismatch方法,自定义输出内容:
import org.mockito.ArgumentMatcher; import org.mockito.Description; import static org.mockito.Mockito.argThat; public class ByteArrayMatchers { // 自定义显示的最大字节数 private static final int MAX_DISPLAY_BYTES = 10; public static byte[] anyByteArray() { return argThat(new ArgumentMatcher<byte[]>() { @Override public boolean matches(Object argument) { return argument instanceof byte[]; } // 定义期望匹配器的描述(简洁明了) @Override public void describeTo(Description description) { description.appendText("任意字节数组"); } // 自定义参数不匹配时的错误信息,控制字节数组显示长度 @Override public void describeMismatch(Object argument, Description mismatchDescription) { if (!(argument instanceof byte[])) { mismatchDescription.appendText("实际类型为").append(argument.getClass().getSimpleName()) .append(": ").append(argument); return; } byte[] actualBytes = (byte[]) argument; StringBuilder sb = new StringBuilder(); sb.append("实际是字节数组(长度: ").append(actualBytes.length).append(")"); if (actualBytes.length > 0) { int displayCount = Math.min(actualBytes.length, MAX_DISPLAY_BYTES); sb.append(" 前").append(displayCount).append("个元素: ["); for (int i = 0; i < displayCount; i++) { if (i > 0) sb.append(", "); sb.append(String.format("0x%02X", actualBytes[i] & 0xFF)); } if (actualBytes.length > displayCount) { sb.append(", ..."); } sb.append("]"); } mismatchDescription.appendText(sb.toString()); } }); } }
效果说明
修改后,当测试失败时,Mockito会输出类似这样的错误信息:
Argument(s) are different! Wanted: mock.someMethod(eq("someArg"), 任意字节数组); -> at com.yourpackage.YourTest.testMethod(YourTest.java:XX) Actual invocations have different arguments: mock.someMethod("someArg", 实际是字节数组(长度: 100) 前10个元素: [0x7B, 0x0A, 0x20, 0x20, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22], ...);
既保留了关键信息(字节数组长度、前N个元素),又避免了超长输出的问题。
内容的提问来源于stack exchange,提问作者zedoo
相关产品推荐
相关产品推荐

