java - 单元测试 (java) : Will I have to write public methods to expose data to unit tests?

标签 java unit-testing junit

我看过 this但它并没有真正有一个好的答案。有时您需要测试一个类的某些行为,但要真正断言您具有预期的行为,您需要检查它的一些私有(private)数据。

一个例子:我正在创建一个类,它将返回从文件中读取的随机单词。所以我设计了一个这样的类:

public class WordsDatabase {
    private List<String> wordsList = new ArrayList<String>();
    
    public WordsDatabase() {
       fillWordsListFromFile();
    }

    private void fillWordsListFromFile() {...}

    public String getRandomWord() {...}
}

我不想公开 wordsList,但现在我应该如何对 getRandomWord() 是否真的从我的字典文本文件中随机获取一个单词进行单元测试?

我只能测试它是否返回一个单词,但我不知道该单词是否是从文件中随机选取的。

为了测试我是否可以对均匀分布执行卡方检验,但我至少必须知道 wordsList.size(),并以某种方式公开它。

也许我只是愿意执行太深的测试...

编辑:

感谢您的回答,知道了。当我的类很难测试时,可能是因为它的设计有问题。

最佳答案

“我应该如何对 getRandomWord() 是否真的从我的字典文本文件中随机获取一个单词进行单元测试?”

这听起来像是模拟和 dependency injection 的完美用例.

  1. 更新你的类,以便在构造时传入这本字典
  2. 在您的单元测试中,传入内容非常有限的不同模拟词典/调用时将返回特定数据
  3. 此更新后,您对 getRandomWord 的单元测试只是验证是否使用了模拟 wordList 中的预期数据。

如果您使用的是像 spring 这样的框架,它是为依赖注入(inject)而设计的。 This other answer有一些关于使用 Spring 解决这个问题的好建议。

关于java - 单元测试 (java) : Will I have to write public methods to expose data to unit tests?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191575/

相关文章:

java - 使用 viewPager 的图像 slider 。滑动时卡住

unit-testing - MockK "io.mockk.MockKException: no answer found for:"错误

java - 如何解决 "cannot find symbol"包中的 Timeout.seconds() 方法生成的 "org. junit.rules.Timeout"错误?

java - 强制slf4j按顺序打印日志

java - 同一对象的 JUnit 测试

Java, Linux : how to detect whether two java. io.Files引用同一个物理文件

c# - 哪些语言支持继承方法返回类型的协变?

java - JFileChooser组件显示怪异

java - 编写 Junit 测试以覆盖异常和 catch block

java - PowerMock NoClassDefFoundError 错误