JUnit のテストメソッド名に日本語を使ったときの問題の解決法 (Java 7)


Java 7 にアップデートしたら日本語メソッド名が通らなくなった

  • 現象
    • クラス全体をテスト実行すると動く
    • 日本語メソッドを選択して実行すると動かない

Java 6 の場合には問題なかったのに、7 にアップデートしたら上手いこと動きません。
しかし、6 に戻すとちゃんと動くので、7 が怪しい…と調べてたら、一応動くようになりました *1
Java 6 の時には問題なかったのに 7 にアップデートしたら上手く動かなくなった!」そんな方にはこのエントリが役に立つかもしれません。

環境は以下のとおりです *2

おすすめエントリ 〜まずはこちらから〜

EclipseJUnit と日本語メソッド名については良く知られている問題ですが、それだけに良エントリも多いです。
単なる解決方法だけでなく、しっかりと解説が入っているのが素晴らしいです。
また、当エントリの内容はこちらのエントリを試されていることが前提になっています。

結論: VM のオプションを設定すれば解決する

Eclipse から VM のオプションを設定すればサクッと解決します。

まずは Eclipse の設定画面から Java SE 7 *3 を選択して「編集」ボタンを押します。
続いて「JRE の編集」画面で、

「デフォルトの VM 引数」に「-Dsun.jnu.encoding=UTF-8」を入力して「完了」ボタンを押します。
これで対応は完了です。さっそく試してみましょう。

解決したことを確認する

先ほどと同じように日本語メソッドを選択してテスト実行してみます。

無事に解決しました。
簡単ですね!*4

以下、蛇足になりますが、ツッコミなど頂けると嬉しいです。

原因は?

私の環境では VM オプションの「sun.jnu.encoding」が US-ASCII になっていたためでした。
以下のような現象から当たりを付け、VM オプションを調べてみました。

  • Java 6 は問題なし
    • Java 6 だと日本語メソッドを問題なく選択実行出来る
    • メインクラス名が日本語でも Eclipse から問題なく実行できる
    • ターミナルからでも実行できる
  • JUnit, Quick JUnit の問題ではない
    • Java 7 でメインクラス名を日本語 *5 にすると Eclipse から普通に実行しても同じエラーになる
    • しかしターミナルからだと問題なく実行できる
    • ついでにターミナルから起動した Eclipse でも問題なく実行できる
    • VM オプション…を設定する Eclipse (の設定) が怪しい?

日本語のクラス名 / メソッド名を一切含まないプロジェクトを作成して、Java 6 と Java 7 で実行時のシステムプロパティを調べてみたのが以下のスクリーンショットになります。
(左側が 6, 右側が 7)

左側の53行目で「sun.jnu.encoding=SJIS」となっているところ右側は「US-ASCII」になっています。
SJIS でも正直微妙なところですが、それにしてもなぜ US-ASCII なのでしょうか…

ちなみにターミナルから実行時は「sun.jnu.encoding=UTF-8」と、UTF-8 になります。
ということで、後はこれを Eclipse から VM 起動時のオプションに設定するだけでした。

謝辞

さらっとツイートされてますが、遅くまで付き合って下さってありがとうございます。
一人だったら途中で「いいや」となっていたと思いますし、解決に向かう考えを上手く整理して頂きました。
@ さん、本当にありがとうございました!

*1:この現象は JREEclipse の設定の合わせ技と言えるかもしれません

*2:いろいろ古い…

*3:名前は自分で決めたものになります

*4:テストメソッドなのに assert してないのはなんていうかもう…

*5:"ほげ" とか