Here's a handy little helper test class for unit testing output streams in Java:
public class AssertOutputStream extends ByteArrayOutputStream {
private final byte[] expected;
public AssertOutputStream(final byte[] expected) {
if (null == expected) throw new NullPointerException();
this.expected = expected;
}
@Override
public void close()
throws IOException {
super.close();
Assert.assertTrue(Arrays.equals(expected, toByteArray()));
}
} Just drop it into a unit test as the destination output stream along with an expected byte array to test that the expected bytes were written out. If you prefer a failure message, it is easy enough to add a member String to hold one for the call to Assert.assertTrue.
UPDATE: Following the suggestion of ThoughtWorker Paul Holser, here is an inproved version:
public class AssertOutputStream extends ByteArrayOutputStream {
private final String message;
private final byte[] expected;
public AssertOutputStream(final byte[] expected) {
this(null, expected);
}
public AssertOutputStream(final String message,
final byte[] expected) {
super(expected.length);
this.message = message;
this.expected = expected;
}
@Override
public void close()
throws IOException {
super.close();
Assert.assertTrue(message,
Arrays.equals(expected, toByteArray()));
}
}
1 comment:
Thanks, Paul! I also suggested two improvements:
1. Replace the null check in the constructor with a call to super(expected.length). This optimizes the actual buffer to the most common case of a passing test.
2. Like you suggested, include a second constructor to pass in an assertTrue message for failing cases.
Post a Comment