我有一个界面:
public interface FileRepository {
String insert(File file) throws IOException;
// other methods ...
}
我的实现insert(File file)
使用本地(以避免并发问题)从其工厂方法java.security.MessageDigester
中抛出检查异常。java.security.NoSuchAlgorithmException
public FileRepositoryImpl(String digestAlgo) throws NoSuchAlgorithmException {
this.digestAlgo = digestAlgo;
MessageDigest.getInstance(digestAlgo);
}
@Override
public String insert(File file) throws IOException {
// initialize message digest
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance(digestAlgo);
} catch (NoSuchAlgorithmException e) {
LOGGER.fatal(MD_INIT_ERROR, e);
return null;
}
// other code ....
}
// other methods (may contain local MessageDigest)
我的实践:由于NoSuchAlgorithmException
总是一个致命错误(这使得模块完全不可用),我尝试MessageDigest
在我的构造函数中初始化 a 来测试 parameter digestAlgo
,因此构造函数可以抛出异常,而不是 from insert(File)
。另一个原因是接口不允许NoSuchAlgorithmException
按定义抛出。
我的问题:在我的实现中,代码
} catch (NoSuchAlgorithmException e) {
LOGGER.fatal(MD_INIT_ERROR, e);
return null;
}
永远不会达到,所以我认为应该有更好的解决方案,可以避免(逻辑上和实际上)无法访问的代码。
欢迎任何解决方案/建议,谢谢。
编辑:
运行代码时这不是真正的问题。但是在测试中,由于代码不可达,再加上一些“try-catch with resources”,质量分析工具(sonar,pmd)会考虑代码“Insufficient branch coverage by unit tests”,这是目前的一大问题。分析报告,这就是为什么我想避免这段代码。
MessageDigest.getInstance(digestAlgo);
另一个问题,在我的构造函数中测试是一个好习惯吗?还是让insert(File)
自己承担全部责任更好NoSuchAlgorithmException
?