java - 如何在由 spring 关闭的可自动关闭 bean 的单元测试中覆盖 close 方法

标签 java spring junit code-coverage autocloseable

我有几个 Spring beans/组件实现 AutoCloseable ,并且我希望 Spring 容器在应用程序上下文被销毁时关闭它们。

无论如何,我的代码覆盖率工具正在提示,因为 close()从它的角度来看,方法是“通过测试发现的”。

我应该做什么:

  1. 介绍一些简单的 close() 测试?
  2. 放手并接受他们会降低覆盖率%
  3. 还有别的事吗?

最佳答案

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

例如,给定以下 Closer 类,该类在关闭时必须关闭其所有 Reader...

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
    }
}

如果代码覆盖率过高意味着您的单元测试包含大量琐碎的测试,特别是当这些测试很脆弱时,这可能是一件坏事。他们将增加维护单元测试所需的工作量,但实际上不会添加任何内容。

关于java - 如何在由 spring 关闭的可自动关闭 bean 的单元测试中覆盖 close 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38823703/

相关文章:

java - 接受类参数的测试方法

java - 在 Spring Boot 2.4 中用我的配置文件 dev 覆盖属性

使用接口(interface)定义spring bean

Maven 无法从具有多个接口(interface)的类中加载 JUnit 类别的组?

Java 分割字符串的连续分隔符

java - Spring Boot部署WAR

java - 绘制组件未被调用

java - 测试 Hibernate 存储库时,Spring Boot 不会处理 junit 中的提交

java - 对调用多个私有(private)方法的公共(public)方法进行单元测试

java - 从 Groovy 控制台运行 JUnit 测试