web-dev-qa-db-ja.com

EasyMock voidメソッド

EasyMockを使用してデータベースインターフェイスのモックを作成して、ラッピングメソッドからビジネスロジックをテストできるようにします。テストのセットアップで以下を使用することで返されるメソッドで大丈夫です。

DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);        

その後、実際のテスト内で実行します

EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);

次に、このサービスはdbmapperに接続してオブジェクトを返します(マッパーはセッターメソッドを使用して挿入されます)

これらのタイプのモックは正常に機能するようです。ただし、テストを実行しようとすると

userService.addUser(newUser1);

このメソッドはvoidメソッドを呼び出します。

dbmapper.createUser(newUser);

私がモックアウトに問題を抱えているのはこの方法です。私は次を試しました

EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

他のいくつかの投稿/質問などは、私がIlligalStateException: no last call on a mock available

誰かが私を正しい方向に向けることができますか?

事前に感謝します

29
FireEnigmaX

あなたは近いです。

expectLastCall()を呼び出す前に、モックでメソッドを呼び出す必要があります。

したがって、期待は次のようになります。

_userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
_

これは、replay()の呼び出し前にモックオブジェクトがレコードモードにあるため機能します。そのため、その呼び出しはデフォルトの動作を実行し(nullを返す/何もしない)、replay()メソッドが呼び出されます。

メソッド呼び出しが予想のためであることを明確にするために私がしたいことは、次のように小さなコメントをその前に置くことです:

_/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
_
34
Dan Temple

「Nice」APIを使用する場合、この問題は発生しません。

DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);

モックには、厳格とニースの2種類があります。 strictモックは、予期しないメソッドが呼び出された場合にアサーションエラーをスローします。 Niceモックは、モックでの予期しないメソッド呼び出しを許可します。

詳細については、公式ドキュメントを参照してください- http://easymock.org/user-guide.html#mocking-strict

13
RakeshK