2011-08-03 2 views
10

EasyMockを使用してJavaコードのユニットテストを行っています。テストしようとしているクラスは、RESTful WebサービスAPIレイヤーです。 APIには、APIテストで嘲笑されている基礎となるサービス層があります。私の問題は、 APIメソッドを正確に単体テストする方法を考え出すことです。なぜなら、service.getById()を2回呼び出して、呼び出しごとに別のオブジェクトが返されることを期待しているからです。EasyMockは、同じテストで複数の異なるオブジェクトを返すメソッドを想定しています。

editObject(ID, params...)最初にIDが有効であることを確認するために、サービスレイヤーからオブジェクトを取得しようとします(最初にservice.getById(ID)が呼び出され、元の未修正オブジェクトが返されます)。次に、API呼び出しで指定されたパラメータを変更してサービスに保存し、呼び出し元にサービス管理された変更オブジェクトを渡します(第2のservice.getbyId(ID)呼び出しは変更されたオブジェクトを返します)。

EasyMockでこれを表現する方法はありますか。

答えて

23

もちろん、同じメソッドとパラメータを使用して2つのメソッド呼び出しを行うことができます。あなたが期待する順序であなたの期待を宣言し、それに応じて回答を設定してください。

expect(mockService.getById(7)).andReturn(originalObject).once(); 
expect(mockService.getById(7)).andReturn(modifiedObject).once(); 
replay(mockService); 

.once()は任意ですが、私はそれがより自己文書です。この場合には見つけます。

0

この手法は、最初の条件を無効にし、2番目の条件を無効にしたい場合や、その逆の条件式でも役立ちます。

5

することはできチェーン複数andReturnメソッド呼び出し:モックはfirstObjectを返します。引数としてservice.getById1と呼ばれ

EasyMock.expect(service.getById(1)) 
    .andReturn(firstObject) 
    .andReturn(secondObject); 

1回目と2回目secondObject。あなたは望みの数だけ連鎖させることができ、さらに特定の呼び出しのためにandThrowによって例外をスローすることもできます。