2015-10-26 13 views
8

我々は(hereから取られた)のような複数のリターンを指定することができます。gmockで作ったモックのために複数のリターンを指定する方法がgmockで連続リターンを指定する方法は? Mockitoで

//you can set different behavior for consecutive method calls. 
//Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls. 
when(mock.someMethod("some arg")) 
    .thenReturn(new RuntimeException()) 
    .thenReturn("foo"); 

//There is a shorter way of consecutive stubbing: 
when(mock.someMethod()).thenReturn(1,2,3); 
when(mock.otherMethod()).thenThrow(exc1, exc2); 

ありますか?現在、私は持っている:私はgmockで複数のリターンを把握することはできませんので、コンパイルされません

store_mock_ = std::make_shared<StorageMock>(); 
ON_CALL(*store_mock_, getFileName(_)).Return("file1").Return("file2"); 

。これはgmockで可能ですか?そうでない場合は、この問題を解決する別の方法がありますか?

using ::testing::Return;... 
EXPECT_CALL(turtle, GetX()) 
    .WillOnce(Return(100)) 
    .WillOnce(Return(200)) 
    .WillOnce(Return(300)); 

しかし、私はON_CALLで複数のリターンをあざけるために任意のドキュメントを発見していない:私たちはEXPECTのような複数の戻り値ができることを発見しました。

答えて

9

ON_CALLは、関数のデフォルトの動作を設定するためにより多く使用されます。私。テストされたコードでは模擬関数が呼び出され、デフォルト値を設定したいが、関数が何回呼び出されたかは実際には重要ではないことがわかっている。

example:私はexpectationsを使用したい

ON_CALL(foo, Sign(_)) 
     .WillByDefault(Return(-1)); 
    ON_CALL(foo, Sign(0)) 
     .WillByDefault(Return(0)); 
    ON_CALL(foo, Sign(Gt(0))) 
     .WillByDefault(Return(1)); 

は、ご希望の動作を取得するには - あなたはすでに問題のいくつかの例を提供し、ちょうどより多く表示するために - あなたは1を期待する場合の一例を、2、常に3

EXPECT_CALL(foo, Sign(_)) 
     .WillOnce(Return(1)) 
     .WillOnce(Return(2)) 
     .WillRepeatedly(Return(3)); 

EXPECT_CALL「道」は、テスト・フィクスチャSetUpでこれを設定したいときに面倒かもしれない - といくつかのテストのメートルお電話はfooに一度だけお電話ください。しかし、当然のことながら、後続の呼び出しのための「制御」ON_CALL戻り値の方法があります - しかし、あなたは特別なアクションでそれを行う必要があります - いくつかの関数の結果を得るように - この例のように:

class IDummy 
{ 
public: 
    virtual int foo() = 0; 
}; 

class DummyMock : public IDummy 
{ 
public: 
    MOCK_METHOD0(foo, int()); 
}; 
using namespace ::testing; 
class DummyTestSuite : public Test 
{ 
protected: 
    DummyMock dummy; 
    void SetUp() override 
    { 
     ON_CALL(dummy, foo()) 
      .WillByDefault(
       InvokeWithoutArgs(this, &DummyTestSuite::IncrementDummy)); 
    } 
    int dummyValue = 0; 
    int IncrementDummy() 
    { 
     return ++dummyValue; 
    } 

}; 


TEST_F(DummyTestSuite, aaa) 
{ 
    ASSERT_EQ(1, dummy.foo()); 
    ASSERT_EQ(2, dummy.foo()); 
    ASSERT_EQ(3, dummy.foo()); 

} 
+1

期待の私の理解では、彼らは私たちが返すと期待されるものであり、実際に模擬兵によって返されるものではありません。それは間違っていますか?あなたの 'IncrementDummy'の例は本当に役に立ちます。複数のリターンを定義する最善の方法はそれほど複雑であると思う。 :( –

+2

私はあなたが正しく理解していれば - はい、私の例は非常に人工的です - 私たちはアサーションによって何が返されるか決してテストしません - このメカニズムが働くことを示すためにこのテストを書いています。テストされたコード内から模擬関数が呼び出されることが予想される場合、 "戻り値"を設定する必要はありません。例えば、void関数が呼び出されると期待していることがよくあります。 – PiotrNycz

関連する問題