我还在努力理解TDD的某些部分。我正在编写一个新的库,所以这似乎是尝试它的好机会。
我读到的关于TDD的内容宣传100%的代码覆盖率,但那似乎有点空中楼阁,所以我配置了JaCoco要求90%的代码覆盖率,以给自己一些余地。
我开始处理加载KeyStore的代码。有很多样板代码和很多已检查异常。所以从这里开始可以让我的日子更轻松。一切看起来都很好,我的测试也通过了。但是代码覆盖率仅为49%。浏览代码,除了我称之为“不可能发生的异常”之外,其他所有内容都被覆盖了:
public void saveKey(Key key, String alias) {
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(new SecretKeySpec(key.getMaterial(), "AES"));
try {
keyStore.setEntry(alias, entry, new KeyStore.PasswordProtection(password));
} catch (KeyStoreException e) {
throw new UnexpectedErrorException("Failed to save the key", e);
}
}
在这种情况下,根据文档,如果未初始化keyStore,则会抛出KeyStoreException。我正在进行防御性编码,并确保在此时keyStore将被初始化。因此,KeyStoreException不可能被抛出。但它是一个受检异常,所以我必须处理它,因此我将其包装在自定义的RuntimeException中。
问题是我无法在单元测试中触发此错误。事实上,我已经尽了最大努力确保它不会发生。
在这种情况下,TDD如何实现神话般的100%覆盖率?
我可以模拟KeyStore,但Mockito的建议是“不要模拟你不拥有的类型。”所以我宁愿不这样做。此外,KeyStore依赖于一些静态方法,Mockito对此没有帮助,我不想为一个简单的情况引入PowerMock,而且我并不认为向问题投入更多库是理想的解决方案。
那么:
TDD的100%代码覆盖率是神话吗?
是否有一种技术可以使代码分析将此代码识别为已覆盖?
我预计的解决方案是将我的配置的90%代码覆盖限制降低到40或50%,直到我有更多的类来提高我的总体平均覆盖率。但在我这样做之前,是否有什么我错过的东西?