InputStream的单元测试IOException

时间:2016-10-14 15:18:22

标签: java unit-testing junit

有没有办法在不使用 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 {
}

任何建议都会很棒。

感谢。

2 个答案:

答案 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)) {
    ...