我正在编写代码,该代码将在Android应用的资源中查找特定文件,并按特定顺序对其执行某些操作。资产管理器很容易使用,但我想知道如何编写代码的自动化测试。
示例:假设我想以某种顺序打印以“cool”开头的所有文件的内容的装饰版本,并且是.txt或.text扩展名。代码相对简单,但依赖于AssetManager(这不是编译或测试过的代码,而是草图):
// Pseudo-code!!!
public void catFiles(Context context, OutputStreamWriter out) {
final AssetManager am = context.getAssets();
final String[] files = am.list('myfolder/');
for (String file: files) {
// Do some filtering on the list
if(veryCoolFilterThinger(file)) {
final InputStream in = am.open(file);
// Do something cool with the chars from the file.
out.write(decorateCharsFrom(in));
}
}
所以问题是,如何测试我的过滤以及如何测试装饰?这里的根本问题是我没有看到如何编写模拟AssetManager。我可以考虑两种选择,它们可以进行不同类型的测试。
选项1:不要直接在资产管理器上运行,而是引入我自己的界面,例如:
interface ReadableFileContainer {
public String[] list(String basePath);
public InputStream open(String path);
}
然后我会为我的测试编写一个这个接口的模拟版本,并使用AssetManager作为我的生产代码。看起来很好,但也感觉AssetManager已经是那种抽象层次,所以我不喜欢这样做。
选项2:编写一堆测试应用程序,每个应用程序具有不同的资产集以提供不同的测试用例。这是非常端到端的,并没有添加可能不需要的抽象层,但确实涉及编写大量的测试应用程序(不仅仅是单独的测试,因为它们需要不同的资产目录结构)。