自作テンプレートを利用する
まだ実装していないテストケースとして引き算、掛け算、割り算のメソッドに対するテストケースがあります。ここで、それぞれのメソッドで「assertEquals...」と書いていくのは少し面倒です。そんなときは、assertEqualsテンプレートを自作すると楽になります。
[ウィンドウ]-[設定]-[Java]-[エディター]-[テンプレート] でテンプレート設定画面を開き、[新規]を押してください。そこで、次のように設定します。

この設定をすることで、エディタ上でaeと打つだけで次のようなコードが自動生成されます。
assertEquals("説明", 期待値, 実際値);
説明、期待値、実際値はそれぞれハイライトされるので、[Tab]で移動して値を埋めていきます。これで、テストケースを作るのが簡単になります。
package hello; import junit.framework.TestCase; public class CalcTest extends TestCase { private Calc calc; public void testAdd() throws Exception { calc = new Calc(); assertEquals("3足す2は5になるはず", 5, calc.add(3,2)); } public void testSub() throws Exception { calc = new Calc(); assertEquals("5引く2は3になるはず", 3, calc.sub(5,2)); } public void testMulti() throws Exception { calc = new Calc(); assertEquals("3かける2は6になるはず", 6, calc.multi(3,2)); } public void testDiv() throws Exception { calc = new Calc(); assertEquals("10割る2は5になるはず", 5, calc.div(10,2)); } }
テンプレートの書式
テンプレートでは、変数と通常の文が定義できます。${}で囲まれた部分が変数となり、それ以外はそのまま通常の文として出力されます。変数にはユーザー変数とビルトイン変数があり、ユーザー変数は上の例で定義した${説明}などで、そのまま文が出力されますがハイライトされた状態になります。ビルトイン変数には、直前に出現したコレクション変数や、クラス名といったコンテキスト情報を取得することができます。
次の例はSingletonパターンを実現するテンプレート定義です。
private static ${enclosing_type} instance; private ${enclosing_type}() { } public static final ${enclosing_type} getInstance() { if (instance == null) { instance = new ${enclosing_type}(); } return instance; }
このテンプレートを実行すると次のようなコードが生成されます。
private static Calc instance; private Calc() { } public static final Calc getInstance() { if (instance == null) { instance = new Calc(); } return instance; }
テンプレートは便利な機能ですが、ビルトイン変数のようにコンテキストを参照する機能を追加することができません。よって、凝ったテンプレートは作ることができません。Getter/Setter生成のような本格的なコード生成機能はソースメニューから実行可能です。ソースメニューにも存在しないような機能はプラグインを利用するしかありません。
リファクタリング/ソース
テストはうまくいきましたが、いくつかの点で不満があります。まずは、割り算なのに返却値が整数型なのは不自然ですし、クラス名もCalcという省略形よりもCalculatorという完全名の方が好ましいでしょう。
一度書いたコードに変更を加えるときは、なるべくリファクタリング機能を使うことをお勧めします。ここでは、良く使うリファクタリング機能に関しての紹介だけに留めさせていただきます。
リネーム([Alt]+[Shift]+R)
最も良く利用するリファクタリング機能はこのリネーム機能でしょう。リネーム機能を使って名前を変更することで、プロジェクト内での名前の整合性をとることができます。例えば、あるXMLファイルにクラス名が記述されているような場合、普通に名前を変更しただけでは外部ファイルとの整合性がとれなくなってしまいます。リネーム機能を使うことで、Javaクラス内での命名の一致のほかに、任意の外部ファイル内に出現する名前も自動的に変換してくれます。
移動([Alt]+[Shift]+V)
クラスをパッケージ間をまたがって移動したりする場合に利用します。移動をすることで、自動的にパッケージ構成の変更や、利用しているクラスのJavaDocタグまで変更することができます。
メニュー([Alt]+[Shift]+T, [Alt]+[Shift]+S)
[Alt]+[Shift]+Tを押すことでリファクタリングメニューが開きます。また、コンストラクタやGetter/Setterの生成などの機能は[Alt]+[Shift]+Sによるソースメニューから実行できます。この2つのメニューは非常に重宝する機能がそろっていますので、ぜひ活用することをお勧めします。
番外編:自作プラグイン
もっとコーディングを簡単にしたい、Java以外の言語も開発したいといった要望に応えるために、Eclipseにはプラグインとして機能を拡張していく仕組みがあります。
プラグインは国産、海外問わず、大量に作成されているため、探せば大概必要なものは手に入ると思います。しかし、プラグイン作成者は汎用的な目的でプラグインを作っている場合が多いため、本当に小さなことだけを行うプラグインは意外と少ないものです。
Getter/Setter自動生成機能の改造
例えば、Eclipse JDTではGetter/Setterを自動生成する機能があり、同時にメソッドにJavaDocを追加してくれますが、追加するJavaDocコメントは次のような形式になってしまいます。
/** * 挨拶. */ private String hello; /** * @return hello を戻します。 */ public String getHello() { return hello; } /** * @param hello 設定する hello。 */ public void setHello(String hello) { this.hello = hello; }
メソッドコメントの形式は設定である程度調整することは可能ですが、helloというフィールドを挨拶というJavaDocコメントに置き換えるというちょっとしたことができません。そこで、自作プラグインとしてJDTを拡張して、次のような形で自動生成を行うような機能を追加してみました。ソースメニューに、アクションを追加しています。
/** * 挨拶. */ private String hello; /** * 挨拶を取得する. * @return 挨拶. */ public String getHello() { return hello; } /** * 挨拶を設定する. * @param hello 挨拶 */ public void setHello(String hello) { this.hello = hello; }
今回はこのプラグインをサンプルコードとして添付します。皆さまのプラグイン開発理解の手助けや、開発の取っ掛かりになればと思います。
終わりに
今回の記事は私が実際にコードを書くときによく使うショートカットキーをまとめたものです。このほかにもEclipseが持っているショートカットキーはまだまだあります。
[Ctrl]+[Shift]+[スペース]でEclipseショートカットキー一覧が表示されますので、自分なりの使い方を開拓していただければと思います。
参考資料
- Eclipse本家
- All-In-One-Project
- JUnit本家
- オブジェクト倶楽部 『JUnit実践講座』

