読者です 読者をやめる 読者になる 読者になる

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

【java】DTO のテストコードを自動生成への道①

(2016/9/24 追記)とりあえず動くものを作った。
【java】DTO のテストコードを自動生成への道② - 山崎屋の技術メモ


プライベート変数とその setter 、 getter のみで構成された DTO のソースを自動生成することがある。

自動生成できるのであれば、そのソース自体をなくす努力をするべきだと思うが、、、 Lombok という setter 、getter 、toString 、 equals を自動生成してくれるライブラリもあるので、なるべくはそれを使いたい。

ただ、プロジェクトの方針や使用するフレームワークによっては、プライベート変数と、その setter、 getter のみで構成されたDTO(これ名前ついてないのかな?)を使わざるを得ない場合もある。

そこで DTO を自動生成するなら、その自動生成した DTO クラスを自動で読み込み、テストコードも自動生成してしまおうというのが今回の主旨である。

ともあれリフレクション

まず、リフレクションについて復習する。

リフレクションを使うと、クラスのメソッド名や、変数名をプログラム実行中に取得できる。

DTO クラスのテストコードを自動生成するのであれば、その DTO の private 変数名を動的に読み込まなければならない。

DTO

次のような DTO を作成した。

package org.yyama;

public class SomeDto {

	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "SomeDto [name=" + name + ", age=" + age + "]";
	}
	
}

name と age というプライベート変数を持っていて、その setter、getter がメソッドとして存在する。toString もついでに作っておいた。

リフレクションを使う

では、リフレクションを使って、SomeDto のプライベート変数の変数名と型を表示してみる。

package org.yyama;

import java.lang.reflect.Field;

public class Main {
	public static void main(String... args) throws Exception {

		// 対象のクラスを取得
		Class<SomeDto> clazz = SomeDto.class;

		// フィールドをすべて取得する。 getFields() というメソッドもあるが、
		// それでは private メソッドを取得できない。
		Field[] fields = clazz.getDeclaredFields();

		for (Field field : fields) {
			// Field#getName() で変数名、
			// Field#getType() で型名を取得できる。
			System.out.println(field.getName() + " : " + field.getType());
		}
	}
}


次のような出力が得られた。プライベート変数がリフレクションで取得できていることが確認できる。

name : class java.lang.String
age : int

まとめ

これを利用して「プライベート変数と、その setter、 getter のみで構成されたDTO」(これ名前ついてないのかな?w)のテストコード自動生成にチャレンジしてみたい。

つづく

(2016/9/24 追記)続きを書いた。
【java】DTO のテストコードを自動生成への道② - 山崎屋の技術メモ


リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)