Google Mock

Why Mock? Mock Object는 real object를 모방하여 대신하기 위해 만들어진 객체로서 real object와 같은 interface를 가지고 각각의 interface 호출시 유저가 정의한 값을 반환하도록 만들어진다. 이러한 Mock Object는 다음의 이유로 사용된다. Object가 비결정적 결과를 return할 때 (현재 시간, 온도 등) Object가 재현 또는 구현하기 힘든 상태를 가질 때 (network error) Object의 동작이 느릴 때 (Test 전에 초기화 되어야 하는 DB) Object를 아직 구현하지 않았거나 동작이 바뀌었을 때 Test를 위한 method나 information을 포함해야 할 때 여기서 Unit Test 시에는 마지막 두가지 이유로 Mock을 사용한다. 아직 구현되지 않은 Object를 대신하여 Test를 진행할 수 없을 때 fake object의 목적으로 구현 Test하고자 하는 과정에서 대상 객체의 Interface가 다음과 같이 정상적으로 호출되었는지를 검사 호출시 parameter 검사 호출 횟수 검사 Google Mock 자체는 Test Framework가 아니라 앞서 말한 Mock Object를 쉽게 만들어주기 위한 도구이다. 결국 Test를 위해서는 Test Framework와 같이 사용되야 한다. Google Test bundel과 함께 제공되므로 Google Test를 사용해도 좋고 CppUnit등과 같은 다른 Test Framework 와 같이 사용할 수 도 있다. System Requirement gcc 4.0+ or Microsoft Visual C++ 8.0 SP1 Users reported that it also works with gcc 3.4, Microsoft Visual C++ 7.1, and Cygwin, although we haven't tested it there ourselves. E...

Iterator Pattern

이미지
ref. GoF Design Pattern. Intent 내부 구조를 노출하지 않고 집합 객체의 element를 순차적으로 접근 할 수 있는 방법을 제공 Also Known As Cursor Motivation 집합 객체의 element에 대한 access와 순회에 대한 책임을 Iterator Object에 전가 Iterator class는 집합 객체의 element에 순차적으로 접근 할 수 있는 다음의 Interface를 정의 First() : current element를 첫번째 element로 초기화  Next() : current element를 다음 element로 변경  IsDone() : current element가 마지막 element 인지 확인  CurrentItem() : current element를 return  이러한 Iterator class를 다형성을 지원하도록 일반화  Aggregate : Iterator Object를 생성하기 위한 Interface를 정의  ConcreteAggregate : Aggregate를 Implement한 집합객체  Iterator : element를 접근하고 순회하기 위한 interface를 정의  ConcreteIterator : ConcreteAggregate에 대한 Iterator  Consequences 객체 내부의 표현 방식을 모르고도 객체의 각 요소를 순회  집합 객체를 순회하는 다양한 방법을 제시  서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회 가능  Implementation 누가 Iterator를 제어 하는지에 따라 다음의 두 가지 방식의 Iterator로 나뉨 External Iterator Client가 Iterator를 control. Internal Iterat...

Google Test를 이용한 Class의 Private/Protected Member Test

ref : googletest advance guild 예전에는 Private/Protected member를 Test할때 test main에 #ifdef TEST #define private public #define protected public #endif 이런 코드를 삽입하여 Test 하는 개발자를 보았다.. ㅋ 이럴 경우 #define TEST를 삽입하면 Test 대상이 아닌 모든 class의 접근 권한까지 public이 되어 버리는 상황이 발생한다. 뭐.. 구현과 Test code의 컴파일을 분리하면 별 문제는 되지 않겠지만...대세처럼 되어가는 TDD 방법론의 경우 Test code를 작성하면서 main code를 작성하기 때문에 위와 같은 code는 개발자가 의도하지 않은 실수를 유발하기 딱 좋다 ㅋ Google Test는 이러한 상황에서 Test code가 다른 프로그램 까지 영향을 미치지 않도록 하는 좋은 방법을 제공한다. // foo.h #include "gtest/gtest_prod.h" // Defines FRIEND_TEST. class Foo {   ...   private :   FRIEND_TEST ( FooTest , BarReturnsZeroOnNull );   int Bar ( void * x ); }; // foo_test.cc ... TEST ( FooTest , BarReturnsZeroOnNull ) {   Foo foo ;   EXPECT_EQ ( 0 , foo . Bar ( NULL ));   // Uses Foo's private member Bar(). } 깔끔하다.. FRIEND_TEST는 gtest_prod.h에 정의 되어 있는데 코드를 보면 다음과 같다. #define FRIEND_TEST(test_cast_name, test_name)\ frien...

std::string::find(...) 사용시 실수..

bool DoTest() {     std::string temp("TEST0006.ts");     if (temp.find("TEST") == 0 && temp.find(".m3u8") > 0) {         return true;     }     return false; } 위 함수를 수행하면 결과는? 결과는 false를 예상했지만... true 가 나온다. 왜? temp.find(".m3u8") 이 -1 이 나오니까 false가 나올꺼 같은데... c++ standard를 찾아보니...     size_type find(const _CharT* __s, size_type __pos = 0) const { ...} 으로 되어 있다. size_type을 찾아보니.. unsigned integral type 이다. unsigned int에서 -1은 최대값 65535이므로 true가 맞다. 앞으론 실수하지 않아야겠다.. -_-;;

gstreamer debug log 출력하는 방법

gstreamer 이용한 실행 파일 실행 전에 $ export GST_DEBUG=[Level] Level = 1 : GST_ERROR()  Level = 2 : Level 1 + GST_WARNING() Level = 3 : Level 2 + GST_INFO() Level = 4 : Level 3 + GST_DEBUG() Level = 5 : outputs everything 을 입력 후 실행

Exceptional C++ Style : 15. 접근 권한의 사용과 오용

이미지
Access Modifiers public protected private class 자신 접근 가능 접근 가능 접근 가능 파생 class 접근 가능 접근 가능 접근 불가 friend 접근 가능 접근 가능 접근 가능 외부 접근 가능 접근 불가 접근 불가 위의 표를 보면 private나 혹은 protected는 외부에서 접근이 불가능하다고 하지만 방법이 없는 것은 아니다. 표준을 만족하지 않고 이식성(Portability)을 만족하지 않는 많은 편법이 존재하고 있으며 그 중 악명높은 방법들을 3가지로 압축하고 있다. Forger(위조범) Pocketpicker(소매치기) The Cheat(사기꾼) 그리고 표준을 완전히 만족하면서 이식성도 보장하는 1가지 방법을 소개한다. 다음 코드를 예로 설명하면 // X.h #ifndef X_H_ #define X_H_ #include <stdio.h> class X { private:    int private_; public:    X() : private_(1) {}    virtual ~X();    template<class T>    void f(const T& t) {    }    int Value() {        return private_;    } }; #endif /* X_H_ */ 위의 코드는 private_라는 private member를 가지고 있고 1로 초기화 되어 있으며 해당 값을 변경할 수 있는 member function을 제공하지 않는다....