EasyMock - Using Stub Behavior for Methods
EasyMock으로 생성한 Mock을 마치 Stub처럼 사용할 수 있습니다. 이 말이 무슨 말이냐면... Mock은 Stub과 달리 예측이라는 개념이 추가되어 있습니다. 따라서 예측 대로 Mock이 수행되지 않으면 AssertionError가 발생하는데, Stub은 그런 개념이 없고, 따라서 구현해둔 메소드가 호출 되든 말든 상관이 없습니다. 다시 돌아가서 Stub 처럼 사용한 다는 것은 Mock으로 레코딩 한 부분이 호출되지 않아도 테스트가 통과 되도록 작성하는 것입니다.
언제 이런 걸 사용할까요. 몇 번이나 호출될지 예상할 수 없을 때 사용할 수 있을 것 같습니다. 아니면 기본적인 규칙이 있다면, 굳이 매번 설정할 필요 없이 EasyMock 문서에 나온대로 사용할 수도 있겠습니다.
expect(mock.voteForRemoval("Document")).andReturn(42);
expect(mock.voteForRemoval(not(eq("Document")))).andStubReturn(-1);
인자가 "Document"일 때는 42를 반환하고, "Document"라는 인자가 아닐 때는 -1을 반환하도록 레코딩 되어 있습니다.
voteForRemoval이라는 메소드는 최소 한 번은 "Document"라는 인자를 받아서 42를 반환하도록 되어 있으며 그 뒤로는 몇 번 호출될지도 모르지만, "Document"라는 인자가 오지는 않을 것이며, 만약 이런 메소드가 호출되면, -1을 반환하도록 레코딩 한 것입니다.
public void arguments() throws Exception {
expect(memberDao.bar(1)).andReturn(1);
expect(memberDao.bar(not(eq(1)))).andStubReturn(2);
replay(memberDao);
int i1 = memberServiceImpl.bar(1);
// int i2 = memberServiceImpl.bar(2);
// int i3 = memberServiceImpl.bar(2);
assertEquals(1, i1);
// assertEquals(2, i2);
// assertEquals(2, i3);
verify(memberDao);
}
따라서 위의 코드에서 주석을 풀어도 되고, 안 풀어도 테스트는 통과합니다.
andStubReturn(), andStubThrow(), andStubAnswer() 를 사용할 수 있습니다.