日々常々

ふつうのプログラマがあたりまえにしたいこと。

JUnitのテストメソッド名に日本語を使ったときの問題と対処

メソッド名を日本語にする話 - 日々常々とかにも書いてるんですが、テストメソッド名に日本語を使うのはザラです。むしろ使わない理由がありません。こんなのですね。

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;

public class HogeTest {

	@Test
	public void ほげはほげのはず() throws Exception {
		assertThat("hoge", is("hoge"));
	}
}

例が悪い?そこは気にしないでくださいませ。

さて、メソッド名に日本語を使った時に、一部IDEでは問題が起こることがあります。一部と言いつつ私はEclipserなのでEclipseの話です。

Eclipseメソッド名がを含むテストクラスの実行

単純に実行するだけです。えいや。

いけますね。余裕です。

メソッド単位で実行する

ちょっと脇道にそれてEclipseの話。
Eclipseはいつからかテストメソッドを選択して実行できるようになっています。確か昔はクラス単位で実行した後、テスト結果の出ているところで選択してからならメソッド単位での実行も出来たんですが、今は一気に出来ます。
やり方は簡単で、実行したいメソッドを選択して実行するだけです。カーソル合わせて*1実行するだけ。えい。

実行結果を見てもらえば testMethod だけが実行されていることが判って貰えると思います。

なお、QuickJUnitでは昔からメソッド単位の実行ができて、こちらだと「実行したいテストメソッド内にカーソルがあれば」そのテストメソッドが実行されます。対してEclipseでは「実行したいテストメソッドを選択していれば」になります。若干挙動が違ったりします。

メソッド名が日本語のテストメソッドを実行する

先と同じように、メソッドを選択して実行します。てい。

だめですね。これで行けるならわざわざこのエントリなんて書きません。*2

対処: eclipse.iniに書く

参考: MacOSX上でQuick JUnitをお使いの皆様へ。日本語クラス名、メソッド名の対応方法 - Fly me to the Juno!
はい、このままです。eclipse.ini に書いてください。QuickJUnitに限ったことではなく、そう言うことです。Macかどーかも関係無く、Winでもeclipse.iniに書けばおっけーです。

-Dfile.encoding=UTF-8

これでいけるはず。と思って素直に再起動……してもだめでした。cleanしてもだめ。なんでだろう。

対処2

正直よくわかってないです。eclipse.iniに追記して、DockにあるEclipse.appを実行ではだめでしたが、ターミナルから

open (Eclipseインストール先)/Eclipse.app

を実行したらいけました。ほら。

なんでだろう。でもそれでいけてるんで、上記のalias作って起動するようにしてます。
うごきゃーいいんだようごきゃー………いや、出来ればちゃんと解決したいんですけど……。

おまけ:プロダクトコードで使わない理由

補完が効かせにくいとか、その辺の理由でプロダクトコードに積極的に日本語メソッド名や変数を使うことはありません。積極的に使わない以上、無理に一部に導入したところで混乱が加速するだけです。プロダクトコードに日本語を使うかどうかは別の議論があるかもしれませんが、現時点では使うことは考えないことにしています。

*1:ここではメソッド名の背景がグレーになっているのがわかると思います。

*2:たまにTDDBCで「これでRedを確認した」となってるのを見ます。ちゃんとエラーメッセージ見て欲しいなーと思いつつ、Greenにならないからすぐ気づくんですけど。仮実装重要ですね。