SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Javaの単体テストでランダムなデータを活用する

QaRandomizerを利用し、ランダムデータを用いた単体テストを実行

RandomAddressオブジェクトの使い方

 前述のとおり、QaRandomizerには、RandomAddressオブジェクト内にランダムな住所データを生成する機能があります。住所データの作成ではまず、QaRandomizerのバイナリにJavaリソースとして組み込まれているXMLファイルから、米国の郵便番号と、その番号に対応する州および市がランダムに抽出されます。次に、架空の街路名と、付随する住所がランダムに追加されます。

 QaRandomizer.getInstance().getAddress()メソッドを使ってランダムな住所を取得する方法の例をリスト4に示します。

リスト4 ランダムな住所情報を含んだLetterオブジェクトを返すプライベートテストメソッド
private Letter getRandomLetter() throws QaRandomizerException {

String toFirstName = QaRandomizer.getInstance().getFirstName();
String toLastName = QaRandomizer.getInstance().getLastName(); 

RandomAddress randomToAddress = QaRandomizer.getInstance().getAddress();

Address toAddress = new Address();
toAddress.setFirstName(toFirstName);
toAddress.setLastName(toLastName);
toAddress.setAddress1(randomToAddress.getAddressOne());
toAddress.setAddress2(randomToAddress.getAddressTwo());
toAddress.setCity(randomToAddress.getCity());
toAddress.setState(randomToAddress.getStateProvince());
toAddress.setZip(randomToAddress.getPostalCode());

String fromFirstName = QaRandomizer.getInstance().getFirstName(); 
String fromLastName = QaRandomizer.getInstance().getLastName();

RandomAddress randomFromAddress = QaRandomizer.getInstance().getAddress(); 

Address fromAddress = new Address();

fromAddress.setFirstName(fromFirstName);
fromAddress.setLastName(fromLastName);
fromAddress.setAddress1(randomFromAddress.getAddressOne());
fromAddress.setAddress2(randomFromAddress.getAddressTwo());
fromAddress.setCity(randomFromAddress.getCity());
fromAddress.setState(randomFromAddress.getStateProvince());
fromAddress.setZip(randomFromAddress.getPostalCode());

Letter letter = new Letter(); letter.setToAddress(toAddress);
letter.setFromAddress(fromAddress);
return letter;
}

 QaRandomizerはSingletonオブジェクトです。Singletonパターンを使っているため、組み込みのリソースファイルの全XMLデータをQaRandomizer内部へ読み込む処理は、モジュール初期化の際に1回だけ行われます。

モックオブジェクトでのランダムデータの使用

 単体テストで肝心なのは、1つの単位の機能ごとにテストを行うことであり、通常はメソッドを単位として考えます。クラス全体の整合性のテストは、結合テストに委ねるのが一般的です。メソッドをテストするときに、未作成のコードを呼び出す必要性が生じることはよくあります。その場合に使用するのがモックオブジェクトです(モックオブジェクトの使い方についてはこのページを参照)。

 PostServiceImplオブジェクトのsend()メソッドをテストするときには、モックオブジェクトが必要となります(PostOfficeImplはPostOfficeインターフェースの実装です)。send()メソッドでは、手紙と電子メールの送信を、PostalDispatchインターフェースを実装した内部オブジェクトに委任します。しかし、PostalDispatchを実装したオブジェクトはまだ作成していません。そこで、モックオブジェクトにPostDispatchインターフェースを実装することにします。

 次のリスト5は、PostOfficeImplオブジェクトに関連するテストシナリオにおいて、モックオブジェクトを使用して未実装の動作をエミュレートした例です。

リスト5 モックオブジェクトを使って未実装のインターフェースPostalDispatcherの使用を検証するテスト
@Test 
public void sendEmailViaPostOfficeTest() throws QaRandomizerException {
// Set up the mock for the PostalDispatcher interface PostalDispatcher
mockDispatcher = createMock(PostalDispatcher.class);
// Set the mock Dispatcher to the Post Office object
PostOfficeImpl.getInstance().setDispatcher(mockDispatcher);
// Get an Email with data from the QaRandomizer Email
email = getRandomEmailWithBody(); 
// Tell the mock framework to expect a call to the 
// dispatch() method
mockDispatcher.dispatch(email); 
// Register the mock scenario
replay(mockDispatcher); 
// Call the behavior that we're testing for
PostOfficeImpl.getInstance().send(email); 
// Verify that the test passed
verify(mockDispatcher); 
}

 リスト5のモックによるテストでは、mockDispatcher.send()メソッドを使用しますが、これにはメールアドレスの指定が必要です。ここで、この要件を満たすために、とりあえずハードコーディングしたメールアドレスを使うという方法もあります。しかし、単体テストにランダム性を取り入れると決めたからには、別の方法を使いましょう。下記のリスト6のコードをリスト5と組み合わせると、QaRandomizer.getEmailAddress()メソッドを活用して、多種多様な条件でのテスト要件を満たす単体テストを簡単に作成できます。

リスト6 ランダムなメールアドレスを使用するプライベートメソッド
private Email getRandomEmailWithBody() throws QaRandomizerException {
// Make the random data string data 
String body = QaRandomizer.getInstance().getComplexString(400);
//Create a random to email
address String toEmail = QaRandomizer.getInstance().getEmailAddress();
//Create a random from email address 
String fromEmail = QaRandomizer.getInstance().getEmailAddress(); 
// Create the Email object 
Email email = new Email(toEmail, fromEmail, body); 
// return it 
return email; 
}

次のページ
特定の型のリストからランダムな項目を取得する

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Bob Reselman(Bob Reselman)

Edmunds Incのシニアテクニカルライター兼テクニカルエディター。Edmunds Inc.は、多彩な情報と高い可用性を誇る、最先端のJavaベースの各種自動車情報Webサイトを運営する大手パブリッシャーである。http://www.edmunds.com/およびhttp://www.insid...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4908 2010/03/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー