プロジェクトにエンコーディング ベースの単体テストがあります。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
getter/setter を使用してパスワードを文字列として保存する単純な Bean です (他のコードはありません)。
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 でデータを出力するように構成されています)
何が問題なのですか?(驚くべき部分は、コンソール出力も適切に表示されないことです)
SOLUTION(恥ずかしい)
私が使用していた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"));
問題を解決しました。
咳、咳、タンブルウィード。