有没有办法在不使用 PowerMock 的情况下对以下代码进行单元测试?我们有声纳单元测试代码覆盖率,它无法识别通过PowerMockRunner测试的代码。所以我一直在寻找一种模拟 IOException 的方法,或者以某种方式使用Mockito来测试这段代码,以便抛出异常。
public void readFile(byte[] bytes) {
try (final InputStream inputStream = new ByteArrayInputStream(bytes)) {
.....
} catch (IOException e) {
throw new SystemException("Error reading file");
}
}
@Test(expected = SystemException.class)
public void testException {
}
任何建议都会很棒。
感谢。
答案 0 :(得分:3)
ByteArrayInputStream
永远不会抛出异常,因此随后您的try
/ catch
毫无意义。只需创建ByteArrayInputStream
并直接使用它并转储异常处理。如果您检查ByteArrayInputStream
的方法签名,则会注意到例外情况已被删除,因此您不必担心此事。
更新
您可以安全地与ByteArrayInputStream
进行互动:
public void readFile(byte[] bytes) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
....
// no need to close the inputStream as it's a NO-OP
}
答案 1 :(得分:1)
您可以通过从字节数组创建并返回new ByteArrayInputStream(bytes)
的方法替换InputStream
。如果你为它创建一个接口,让我们说
interface InputStreamFactory {
InputStream from(byte[] bytes);
}
然后,您可以拥有一个为生产代码返回ByteArrayInputStream
的实现,以及一个返回抛出IOException
进行测试的对象的实现。也许有一天会BufferedInputStream
,等等。
private final InputStreamFactory factory;
[...]
public void readFile(byte[] bytes) {
try (final InputStream inputStream = factory.from(bytes)) {
...