我看过 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 的完美用例.
- 更新你的类,以便在构造时传入这本字典
- 在您的单元测试中,传入内容非常有限的不同模拟词典/调用时将返回特定数据
- 此更新后,您对
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/