java - 如何编写单元测试来涵盖抛出 IOException 的情况?

标签 java unit-testing

我有以下类(class):

    public class FileLoader {   

         private Map<Brand, String> termsOfUseText = new HashMap<Brand, String>();

         public void load() {
            for (Brand brand : Brand.values()) {
                readAndStoreTermsOfUseForBrand(brand);
            }
         }

         private void readAndStoreTermsOfUseForBrand(Brand brand) {
            String resourceName = "termsOfUse/" + brand.name().toLowerCase() + ".txt";          
            InputStream in = this.getClass().getClassLoader().getResourceAsStream(resourceName);            
            try {
                String content = IOUtils.toString(in);          
                termsOfUseText.put(brand, content);
            } catch (IOException e) {
                throw new IllegalStateException(String.format("Failed to find terms of use source file %s", resourceName),e);
            }
         }

        public String getTextForBrand(Brand brand) {
            return termsOfUseText.get(brand);
        }
    }

Brand 是一个枚举,我需要所有有效的 .txt 文件都在类路径中。如果 Brand 枚举包含所有有效品牌,因此它们的所有 .txt 文件都存在,我该如何使 IOException 发生?

欢迎提出有关重构当前代码的建议,前提是它更易于测试!

最佳答案

我马上看到的三个选项:

  1. 使用PowerMock模拟 IOUtils.toString()。我认为 PowerMock 是最后的选择。我宁愿将源代码重构为对测试更友好的东西。
  2. 提取 IOUtils 对 protected 方法的调用。创建类的特定于测试的子类,以覆盖此方法并抛出 IOException。
  3. 将创建的 InputStream 提取到 protected 方法中。创建一个特定于测试的子类来覆盖该方法并返回一个模拟 InputStream。

关于java - 如何编写单元测试来涵盖抛出 IOException 的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701477/

相关文章:

java - 有没有更简洁的方法来初始化这个通用数组?

java - Elastic beanstalk 中的简单 C 程序

java - 从 socket.io 从 android 发送 JSON 数据

java - 在 Java 中运行一定时间的采样过程并返回值

java - 更改 ListView 的 ArrayList 是静态的适当使用吗?

wpf - 如何对 IDataErrorInfo 业务对象中的错误进行单元测试?

python - Python 中的单元测试装置?

unit-testing - 如何为主要面向服务的应用程序编写有用的单元测试?

c# - 如何在 EF 中模拟和单元测试存储过程

python - 如何在 python 中创建/实现/测试新的异常?