我有一个TOTP验证器项目,它使用TOTP(RFC 6238(生成一个六位数的一次性密码。在内部,它使用Apache Commons Codec:中的Base32类
Base32 base32 = new Base32();
遵循commons编解码器升级1.14->1.15,单元测试开始失败:
@Test
void testInvalidBase32Value() {
String secretKey = "AHXQ2W5P6AGKYVK";
Executable when = () -> generator.generateOtp(secretKey);
assertThrows(IllegalArgumentException.class, when);
}
org.opentest4j.AssertionFailedError: Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.
如何修复测试?
根据Apache Commons Codec 1.15发布说明,默认解码策略已更改:
Base32/Base64/BOCdec:添加了严格的解码属性来控制尾位的处理。默认的宽松模式会毫无错误地丢弃它们。严格模式引发异常。
新的默认解码策略在BaseNCodec.java:中定义
protected static final CodecPolicy DECODING_POLICY_DEFAULT = CodecPolicy.LENIENT;
要修复单元测试,请在generateOtp()
:中将解码策略设置为CodecPolicy.STRICT
Base32 base32 = new Base32();
->
Base32 base32 = new Base32(0, null, false, PAD_DEFAULT, CodecPolicy.STRICT);
现在,导致编解码器失败的数据应该引发异常。