Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Hippo Mocksなるものを見つけた

タグ: C++ Boost

http://www.assembla.com/wiki/show/hippomocks/
Hippo Mocks

( ´∀`) 逆立ちしたカバなーんだ

Excite ウェブページ翻訳
カバは馬鹿にします。

( ゚д゚ )


まあ名前はさておき。
C++のMockフレームワークはmockppくらいしか使ったことがないが、

  • ヘッダファイルを一つincludeするだけで使える
  • ライブラリのリンクは必要なし
  • Mockクラスを定義する必要もなし

という使い勝手はなかなか魅力的に見える。
試しに最新版(Hippo Mocks 3.1)をVC8上でBoost 1.40.0のユニットテストフレームワークと組み合わせて使ってみよう。

#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/foreach.hpp>
#include <hippomocks.h>

// まだ実装のないインタフェース
class Receiver
{
public:
    virtual ~Receiver() {}

    virtual void Number(size_t n) = 0;
    virtual void Value(const char* value) = 0;
};

// アルファベットをスペースでトークン分割して receiver に渡す関数
bool tokenize(const char* source, Receiver& receiver)
{
    using namespace boost::spirit;

    std::vector<std::string> values;
    bool result = qi::parse(source, source + strlen(source), raw[*ascii::alpha] % ' ', values);

    receiver.Number(values.size());
    BOOST_FOREACH(const std::string& value, values)
    {
        receiver.Value(value.c_str());
    }
    return result;
};

// Hippo Mocksの文字列ポインタ比較を特殊化
template <>
struct comparer<const char*>
{
    static inline bool compare(const char* a, const char* b)
    {
        return strcmp(a, b) == 0;
    }
};

BOOST_AUTO_TEST_CASE(Test)
{
    MockRepository mocks;
    Receiver* iamock = mocks.InterfaceMock<Receiver>();
    mocks.ExpectCall(iamock, Receiver::Number).With(3);
    mocks.ExpectCall(iamock, Receiver::Value).With("foo");
    mocks.ExpectCall(iamock, Receiver::Value).With("bar");
    mocks.ExpectCall(iamock, Receiver::Value).With("baz");
    // 以下のように呼ばれることを期待
    // iamock->Number(3); 
    // iamock->Value("foo"); 
    // iamock->Value("baz"); 
    // iamock->Value("baz"); 
    BOOST_CHECK(tokenize("foo bar  baz", *iamock));
}
Running 1 test case...
unknown location(0): fatal error in "Test": std::exception: Function Receiver::Number(4) called with
 mismatching expectation!
Expections set:
test.cpp(47) Expectation for Receiver::Number(3) on the mock at 0x003AB3F8 was not satisfied.
test.cpp(48) Expectation for Receiver::Value(foo) on the mock at 0x003AB3F8 was not satisfied.
test.cpp(49) Expectation for Receiver::Value(bar) on the mock at 0x003AB3F8 was not satisfied.
test.cpp(
test.cpp(56): last checkpoint

*** 1 failure detected in test suite "Master Test Suite"

Hippo Mocksのメッセージが見切れてる(´・ω・`)
Boost.Testがカットしちゃったのか。
「期待される関数呼び出しが成されたか」を全て列挙してくれるのは親切といえば親切だが、見切れると辛い。

ちなみにこの例は「tokenize()が連続するスペースを一つのデリミタと見なさない」のが期待に沿わない部分なので、parse部分を次のように変更すればテストに合格するようになる。

// qi::phrase_parse を使えばいい話だが
bool result = qi::parse(source, source + strlen(source), raw[*ascii::alpha] % +char_(' '), values);
Running 1 test case...

*** No errors detected
スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/219-346a88ae
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。