RandomAddressオブジェクトの使い方
前述のとおり、QaRandomizerには、RandomAddressオブジェクト内にランダムな住所データを生成する機能があります。住所データの作成ではまず、QaRandomizerのバイナリにJavaリソースとして組み込まれているXMLファイルから、米国の郵便番号と、その番号に対応する州および市がランダムに抽出されます。次に、架空の街路名と、付随する住所がランダムに追加されます。
QaRandomizer.getInstance().getAddress()メソッドを使ってランダムな住所を取得する方法の例をリスト4に示します。
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オブジェクトに関連するテストシナリオにおいて、モックオブジェクトを使用して未実装の動作をエミュレートした例です。
@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()メソッドを活用して、多種多様な条件でのテスト要件を満たす単体テストを簡単に作成できます。
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;
}
