java - 由于编码问题,Maven 未能通过我的单元测试

标签 java maven encoding utf-8 junit

我的项目中有一个基于编码的单元测试。在 Eclipse 中测试通过,但在 Maven 中测试失败。

我的所有文件都是 UTF-8 编码的,我在 pom.xml 中添加了以下两行,但测试一直失败:

<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 附加程序也配置为以 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"));

解决了问题。

咳嗽,咳嗽,风滚草。

最佳答案

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

Eclipse 对源文件编码的理解也可能与 Maven 不同(您可以通过右键单击文件并执行“属性”进行检查)。通常 m2e 会为您解决这个问题。

顺便说一句 - 为什么要编写处理 HTTP 身份验证的代码?您应该使用库。

关于java - 由于编码问题,Maven 未能通过我的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364149/

相关文章:

java - 注销Struts 2.0应用程序后的chrome后退按钮

java - resttemplate.exchange 抛出空指针异常

java - 线程中的异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -1

java - 通过在maven java项目中引用parent来拉取模块的依赖关系?

java - jar 上的 Maven 项目许可证报告

javascript - 从 NodeJs Cloud Function 传输文件时如何解决编码问题?

encoding - GUID 有多少个字符?

java - 在Java中使用正则表达式过滤多个标志

java - 如何在与 Maven 构建的 war 中包含带有源代码的 jar

Python ascii编码问题