由于编码问题,Maven无法进行单元测试

时间:2013-08-21 17:39:20

标签: java maven encoding utf-8 junit

我的项目中有基于编码的单元测试。测试在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的String(其他代码没有)。

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"));

解决了这个问题。

咳嗽,咳嗽,风滚草。

2 个答案:

答案 0 :(得分:2)

我认为解决方法是转义像

这样的字符
String password = ":&=/?\u00e9$\u00a3";

答案 1 :(得分:2)

Base64.encodeString(login + ":" + password)隐式使用字符编码(平台默认,Maven和Eclipse之间可能会有所不同),因为它必须先将字符串转换为字节数组才能散列它。您应该明确指定 - 大概是ISO-8859-1,请参阅此问题What encoding should I use for HTTP Basic Authentication?

Eclipse也可能与Maven有不同的源文件编码概念(您可以通过右键单击文件并执行属性来检查)。通常m2e会为你排序。

暂且不说 - 为什么要编写代码来处理HTTP身份验证?你应该使用一个库。