0

我有几个 Spring beans/components implementations AutoCloseable,我希望 Spring Container 在应用程序上下文被销毁时关闭它们。

无论如何,我的代码覆盖工具在抱怨,因为close()从它的角度来看,这些方法是“被测试发现的”。

我应该怎么办:

  1. 介绍一些琐碎的 close() 测试?
  2. 放手去接受他们会降低覆盖率
  3. 还有什么?
4

1 回答 1

1

您不是在测试应用程序是否关闭了 bean,而是在测试 bean 在关闭时是否正确关闭。如果实现很重要,那么您应该为该行为编写一个测试。如果您的方法所做的只是在单个字段上调用 ​​close,那么不要费心对其进行测试。但是,如果您的 close 方法在多个字段上调用 ​​close 或执行一些更复杂的操作,那么您应该对其进行测试。

例如,给定以下Closer类,Reader当它关闭时必须关闭它的所有 s...

public class Closer implements AutoCloseable {

    private Reader[] readers;

    public Closer(Reader... readers) {
        this.readers = readers;
    }

    @Override
    public void close() {
        try {
            for (Reader reader : readers) {
                reader.close();
            }
        } catch (IOException ex) {
            // ignore
        }
    }
}

您可能希望这样测试:

public class CloserTest {

    @Test
    public void allReadersClosedWhenOneReaderThrowsException() {
        // given
        Reader badReader = mock(Reader.class);
        Reader secondReader = mock(Reader.class);
        doThrow(new IOException()).when(badReader).close();
        Closer closer = new Closer(badReader, secondReader);

        // when
        closer.close();

        // then
        verify(badReader).close();
        verify(secondReader).close(); // fails as loop stops on first exception
    }
}

过高的代码覆盖率可能是一件坏事,如果这意味着您的单元测试包含大量琐碎的测试,尤其是在这些测试很脆弱的情况下。他们将增加维护单元测试所需的工作量,而无需实际添加任何内容。

于 2016-08-08T08:21:35.030 回答