テストで文字列表現を使う。文字列表現クラス。
2007/02/18
d:id:e_c_e_t:20070208 のようにテストで期待値と実測値を比較する時に文字列表現を使う方についての話。(オチ付き)
データを格納しているBeanが、正しい状態で取得できたかというテストは、嫌になるほど書く必要があるんですが、文字列表現で比較するために、テスト対象のBeanのメソッドを修正するのは、筋違いなので、以下のクラスを使いました。
テストユーティリティとしての文字列表現作成クラス
package hoge; import org.apache.commons.beanutils.BeanUtils; public class StringExpression { public static String toString(Object o, String[] propertyNames) { String expression = ""; for (String propertyName : propertyNames) { try { expression += propertyName + ":" + BeanUtils.getProperty(o, propertyName) + "\n"; } catch (Exception e) { throw new RuntimeException("error occured.", e); } } return expression; } }
StringExpressionクラスのtoStringメソッドは、第一引数のインスタンスの、第二引数で指定されたプロパティを文字列表現を返します。
テスト対象クラス
package hoge; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; public class TestBean { private String name; private int maxNo; private Date registerDate; public int getMaxNo() {return maxNo;} public void setMaxNo(int maxNo) {this.maxNo = maxNo;} public String getName() {return name;} public void setName(String name) {this.name = name;} public Date getRegisterDate() {return registerDate;} public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } public static TestBean getTestBean() throws ParseException { TestBean bean = new TestBean(); bean.setName("hogehoge"); bean.setMaxNo(5); bean.setRegisterDate( DateFormat.getInstance() .parse("2007/02/18 00:00:00")); return bean; } }
テストクラス
package hoge; import java.text.ParseException; import junit.framework.TestCase; public class TestBeanTest extends TestCase { public void testGetTestBean() { TestBean resultBean = null; //execute try { resultBean = TestBean.getTestBean(); } catch (ParseException e) { e.printStackTrace(); fail(); } //test assertEquals("class:class hoge.TestBean\n" + "name:hogehoge\n" + "maxNo:5\n" + "registerDate:Sun Feb 18 00:00:00 JST 2007\n", StringExpression.toString(resultBean, new String[] { "class", "name", "maxNo", "registerDate"})); } }
上の StringExpression.toString 呼び出しで、文字列化するためのプロパティ名配列を指定して、resultBeanの文字列表現に変換すると、下のようになります。
class:class hoge.TestBean name:hogehoge maxNo:5 registerDate:Sun Feb 18 00:00:00 JST 2007
その後、文字列変換をしています。これだと、eclipseでテスト失敗時にdiffを表示したときにもどこが違っていたかが、一目瞭然になります。
まあ、上のStringExpressionクラスは、限定的な状況でしか使えません。bean のプロパティがListだったりした場合の考慮は全くされていません。
オチ
JUnit JUnit 実践講座 – Converterを使ったJUnitプログラミングというのを公開されていました。これは、いろいろな状況まで考慮されていて、非常に本格的なもののようでした。しかも、2003年の記事。
追記:2007/04/22
JUnit 実践講座のサイトを執筆していた方は、JR脱線事故でお亡くなりになっていたそうです。ご冥福をお祈りします。いわをさんに教えていただきました。
おぼろげながらの記憶ですが、JUnit JUnit 実践講座の確かこの方は事故でお亡くなりになられたと聞きました。このサイト全般に更新がとまっているはずです。
>いわをさん
コメントありがとうございます。そうだったのですね。残念です。
#エントリの最後が不謹慎だったので、削除しました。