E D R , A S I H C RSS

Mock Objects

UnitTest를 위한 일종의 보조객체.

What ?

실제의 객체역할을 흉내내는 일을 하는 객체이다. 보통 MockObject라는 클래스를 상속받아서 (구현은 각 언어별로 '알아서'이다. ^^; 처음 Mock 의 개념이 나온 컬럼은 Java 소스였다.) 만들어준다. 테스트를 위해서는 처음에 해당 객체에 초기설정을 해 둔다. 그리고 Test를 돌리게 된다.

말로 하면 좀 어렵고. --; 예를 들어서 설명하는게 좀 더 이해하기 쉽겠다.

사용 예1) 여러 사람이 프로그래밍 할때, 독립된 프로그램이 아닌 모듈별로 프로그램을 만들고 있는 경우. 이럴때 해당 모듈을 작성하고 테스트 코드를 만들려고 해도, 다른 모듈의 의존성 때문에 진행이 어렵게 된다. 아직 완성되지 않은 의존성을 가진 모듈을 MockObject로 만듬으로서 해당 모듈을 만드는 동안의 의존성문제를 해결할 수 있다.
인터페이스가 확실하게 정해지지 않은 모듈에 대해서는 어떻게 할 것인가?

-> MockObjects 자체가 인터페이스정의를 위한 도구로 이용할 수 있다. (TestFirstProgramming 에서는 Test Code가 일종의 인터페이스를 정의하기 위한 방법으로 이용된다.)

사용 예2) Datatbase 와 관련된 프로그래밍에 대해서 UnitTest를 할때, DB Connection 에 대한 MockObject를 만들어서 DB Connection을 이용하는 객체에 DB Connection 객체 대신 넣어줌으로서 해당 작업을 하게끔 할 수 있다. 그리고 해당 함수 부분이 제대로 호출되고 있는지를 알기 위해 MockObject안에 Test 코드를 넣어 줄 수도 있다.

문제점

MockObject 는 어디까지나 가짜객체이다. 실제 테스트를 할때에는 MockObject를 이용한 경우와 실제의 객체를 이용했을때의 경우 둘 다 고려해야 한다.

그리고 위와 같은 경우 UnitTest 코드의 중복을 가져올 수도 있다. 이는 상속과 오버라이딩을 이용, 해결한다.

어떻게 구현하고 사용할까 ?

본래 MockObjects 관련 글은 Java 소스이지만 각 언어에 따라 나름대로 구현할 방법이 있겠다.
위의 framework 에서는 대강 이렇다.
Class Name 역할
MockObject Mock Object들의 상위클래스. Mock Object들은 MockObject 들을 상속받아서 구현한다.
Expectation 소위 말하는 '기대값' 을 위해 미리 Mock Object에 예정된 값들을 채워넣기 위한 클래스들. MockObject는 자신의 구현을 위한 자료구조체로서 Expectation 클래스들을 이용할 수 있다.
ExpectationCounter 해당 함수의 기대하는 호출횟수를 카운트 하기 위한 도움 클래스
ExpectationList List 도움 클래스
ExpectationSet 집합 도움 클래스. 내부적으로는 Dictionary를 이용, flag check
ExpectationMap Key : Value. Map 도움 클래스

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:47
Processing time 0.0176 sec