3. 논리 연산 함수 사용 연습
앞서 언급한 EasyMock의 편의 함수에 대해서 연습해보자. 테스트 대상 객체는 의미없이 DomainObject라고 하자. DomainObject는 내부적으로 계산기 기능을 하는 Calculator 타입의 객체를 콜레보레이터(collabrotator)로 요구한다.

 @Test public void logicalOperator(){
  DomainObject domain = new DomainObject();
  Calculator mockCalulator = createMock(Calculator.class);
  domain.setCalculator(mockCalulator);
 
  mockCalulator.calc(anyInt(), anyInt());
  replay(mockCalulator);
 
  domain.doSomething(1,2);
  verify(mockCalulator);
 }


테스트 대상이 되는 객체의 정의는 다음과 같다.

public class DomainObject {

 private Calculator calculator;

 public void setCalculator(Calculator calulator) {
  this.calculator = calulator;
 }

 public void doSomething(int i, int j) {
  calculator.calc(i, j);
 }

}

public interface Calculator {

 public void calc(int i, int j);

}

테스트는 통과한다.

  mockCalulator.calc(1,2);
  replay(mockCalulator);

  domain.doSomething(1,2);
  verify(mockCalulator);

위 테스트 코드 블럭의 첫 줄은 다음가 같이 수정해도 동일한 내용이 된다.

mockCalulator.calc(eq(1),eq(2));

eq() 메소드는 인자로 제공되는 값과 동일한 값을 갖는 인자를 기대하게 (녹화) 한다. 반환 값으로 인자와 같은 값을 반환하기 때문에 calc() 메소드의 인자로 1, 2가 순서대로 전달되는데 아무런 문제가 없다. 이러한 방식으로 설계된 메소드 인터페이스를 Fluent Interface라고 한다.

gt(), lt()를 사용해보자. 이들은 각각 "Greater Than"과 "Less Than"의 "크다", "작다"의 의미다.

  mockCalulator.calc(gt(0),lt(2));
  replay(mockCalulator);

  domain.doSomething(1,2);
  verify(mockCalulator);

gt(0)은 문제가 없지만, lt(2)는 통과하지 못한다. leq() 메소드의 경우는 통과한다.

  mockCalulator.calc(gt(0),leq(2));

leq()와 geq()는 각각 "Less than or EQual to"와 "Greater than or EQual to"를 나타낸다. 비슷하게 생각하여 다음 코드를 실행해보면 실패가 되는 것을 알 수 있다.

 mockCalulator.calc(not(5), not(3));

not()주어진 예상 결과가 인자의 값과 다름을 나타내는 것이므로 예상되는 인자값 설정에는 부적절하다. 게다가 항상 반환 값이 0이 된다.

여타 다른 논리 연산 메소드는 추가로 살펴보겠다.


관련 글:
- EasyMock2을 활용한 협업 테스트 1
- EasyMock2을 활용한 협업 테스트 2

참고:
- EasyMock 2.2 Readme
- EasyMock 2.2 API Documetation

이올린에 북마크하기(0) 이올린에 추천하기(0)