我的项目中有一个基于编码的单元测试。测试在 Eclipse 中通过,但在 Maven 中失败。
我所有的文件都是 UTF-8 编码的,我在 pom.xml 中添加了以下 2 行,但测试一直失败:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
这是测试中有趣的部分。Credentials
是一个简单的 bean,将密码存储为带有 getter/setter 的字符串(那里没有其他代码)。
AuthentificationHelper helper = new AuthentificationHelper();
// ...
String password = ":&=/?é$£";
String base64Hash = Base64.encodeString(login + ":" + password);
final String authHeader = "Basic " + base64Hash;
// ...
Credentials credentials = helper.credentialsWithBasicAuthentication(request);
assertEquals(password, credentials.getPassword());
与credentialsWithBasicAuthentication
此处所做的操作相反:
StringTokenizer st = new StringTokenizer(authHeader);
//...
String credentials = new String(Base64.decodeBase64(hashedCredentials), "UTF-8");
int p = credentials.indexOf(":");
//...
String password = credentials.substring(p + 1).trim();
return new Credentials(login, password);
这是 Maven 的输出:
Failed tests:
testCredentialsWithBasicAuthentication: expected:<:&=/?[?$?]> but was:<:&=/?[?$?]>
(不确定这是否相关,但我的 log4j appender 也配置为以 UTF-8 输出数据)
知道有什么问题吗?(令人惊讶的是控制台输出也没有正确显示)
解决方案(尴尬)
我使用的Base64
类不是 Apache Commons 提供的,而是随机的。
更换:
import random.bla.bla.Base64;
// ...
String base64Hash = Base64.encodeString(login + ":" + password);
经过
import org.apache.commons.codec.binary.Base64;
// ...
String base64Hash = Base64.encodeBase64String(new String(login + ":" + password).getBytes("UTF-8"));
解决了这个问题。
咳嗽,咳嗽,风滚草。