ot; + resourceName + " from " + testClass;
try (Reader reader = new BufferedReader(new InputStreamReader(in))) {
mValue = mGson.fromJson(reader, clazz);
}
}
Listing 10. Statement的实现.
description 参数在这里是必不可少的,它可以让我们访问测试方法包括注解在内的元数据。Rule适用于所有测试方法,包括没有注解的,这种情况下getAnnotation()会返回null ,并且我们可以有条件地跳过定制的其余部分。所以测试方法没有@JsonFileResource 注解的测试方法(比如,一些不涉及JSON的测试)可以放在使用了JsonParsingRule 的测试类中。第8行是下面代码的一个简写等效:
if (in != null) {
throw new AssertionError("Failed to load resource: " + resourceName + " from " + testClass);
}
Listing 11. 断言语句判定.
最后我们传入使用被Reader包装的resource到GSON引擎。Try-with-resources语句在这里被使用,所以Reader将会在读取甚至发生异常之后自动关闭。这里需要在finally 块中明确类型。
注意try-with-resources从Android API 19(Kitkat)才可用。如果测试代码位于Android gradle module中,并且你的minSdkVersion 低于19,那么你可能需要在eva luate() 方法上增加@TargetApi(Build.VERSION_CODES.KITKAT) 注解来避免lint错误。单元测试会在开发机器(Mac,PC等)上被执行而不是Android设备或者模拟器,所以这里只有compileSdkVersion 才是关键。
这样的单元测试(不需要使用Android特定的API)也可以被放在java module中(build.gradle 中apply plugin: 'java' )。理论上这事最好的idea,但是在Android Studio/Intellij IDEA中有一个问题需要预防,那就是从IDE开箱即用地执行单元测试的配置工作。
|