How can i call my mock method two times with two different argument value









up vote
1
down vote

favorite












Suppose I have to test the mock method GetSegment with exclusive value 0 and 1(two times).



EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));


Thanks,










share|improve this question



























    up vote
    1
    down vote

    favorite












    Suppose I have to test the mock method GetSegment with exclusive value 0 and 1(two times).



    EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
    WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));


    Thanks,










    share|improve this question

























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      Suppose I have to test the mock method GetSegment with exclusive value 0 and 1(two times).



      EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
      WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));


      Thanks,










      share|improve this question















      Suppose I have to test the mock method GetSegment with exclusive value 0 and 1(two times).



      EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
      WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));


      Thanks,







      c++ googletest googlemock gmock






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 10 at 11:08









      ACupOfBreadTea

      215




      215










      asked Nov 10 at 11:04









      Abhi

      83




      83






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote



          accepted










          Just do several WillOnce - one after another.



          Like:



          EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
          .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
          .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));


          You can read in doc that WillOnce can be used several times in one EXPECT_CALL:




          EXPECT_CALL(mock_object, method(matchers))
          .WillOnce(action) *




          The simplified example that works:



          class MockMM

          public:
          MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
          ;

          TEST(A, A)

          MockMM mock;
          EXPECT_CALL(mock, GetSegment(1, _, _, _))
          .WillOnce(SetArgPointee<3>(0))
          .WillOnce(SetArgPointee<3>(1));

          int a;
          int b;
          mock.GetSegment(1, 1, 0, &a);
          mock.GetSegment(1, 0, 1, &b);
          ASSERT_EQ(0, a);
          ASSERT_EQ(1, b);




          You might also use sequences:




          When you have a long chain of sequential expectations, it's easier to
          specify the order using sequences, which don't require you to given
          each expectation in the chain a different name. All expected calls in
          the same sequence must occur in the order they are specified.




          using ::testing::Sequence;
          Sequence s1, s2;
          ...
          EXPECT_CALL(foo, Reset())
          .InSequence(s1, s2)
          .WillOnce(Return(true));
          EXPECT_CALL(foo, GetSize())
          .InSequence(s1)
          .WillOnce(Return(1));
          EXPECT_CALL(foo, Describe(A<const char*>()))
          .InSequence(s2)
          .WillOnce(Return("dummy"));





          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238299%2fhow-can-i-call-my-mock-method-two-times-with-two-different-argument-value%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote



            accepted










            Just do several WillOnce - one after another.



            Like:



            EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
            .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
            .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));


            You can read in doc that WillOnce can be used several times in one EXPECT_CALL:




            EXPECT_CALL(mock_object, method(matchers))
            .WillOnce(action) *




            The simplified example that works:



            class MockMM

            public:
            MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
            ;

            TEST(A, A)

            MockMM mock;
            EXPECT_CALL(mock, GetSegment(1, _, _, _))
            .WillOnce(SetArgPointee<3>(0))
            .WillOnce(SetArgPointee<3>(1));

            int a;
            int b;
            mock.GetSegment(1, 1, 0, &a);
            mock.GetSegment(1, 0, 1, &b);
            ASSERT_EQ(0, a);
            ASSERT_EQ(1, b);




            You might also use sequences:




            When you have a long chain of sequential expectations, it's easier to
            specify the order using sequences, which don't require you to given
            each expectation in the chain a different name. All expected calls in
            the same sequence must occur in the order they are specified.




            using ::testing::Sequence;
            Sequence s1, s2;
            ...
            EXPECT_CALL(foo, Reset())
            .InSequence(s1, s2)
            .WillOnce(Return(true));
            EXPECT_CALL(foo, GetSize())
            .InSequence(s1)
            .WillOnce(Return(1));
            EXPECT_CALL(foo, Describe(A<const char*>()))
            .InSequence(s2)
            .WillOnce(Return("dummy"));





            share|improve this answer
























              up vote
              0
              down vote



              accepted










              Just do several WillOnce - one after another.



              Like:



              EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
              .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
              .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));


              You can read in doc that WillOnce can be used several times in one EXPECT_CALL:




              EXPECT_CALL(mock_object, method(matchers))
              .WillOnce(action) *




              The simplified example that works:



              class MockMM

              public:
              MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
              ;

              TEST(A, A)

              MockMM mock;
              EXPECT_CALL(mock, GetSegment(1, _, _, _))
              .WillOnce(SetArgPointee<3>(0))
              .WillOnce(SetArgPointee<3>(1));

              int a;
              int b;
              mock.GetSegment(1, 1, 0, &a);
              mock.GetSegment(1, 0, 1, &b);
              ASSERT_EQ(0, a);
              ASSERT_EQ(1, b);




              You might also use sequences:




              When you have a long chain of sequential expectations, it's easier to
              specify the order using sequences, which don't require you to given
              each expectation in the chain a different name. All expected calls in
              the same sequence must occur in the order they are specified.




              using ::testing::Sequence;
              Sequence s1, s2;
              ...
              EXPECT_CALL(foo, Reset())
              .InSequence(s1, s2)
              .WillOnce(Return(true));
              EXPECT_CALL(foo, GetSize())
              .InSequence(s1)
              .WillOnce(Return(1));
              EXPECT_CALL(foo, Describe(A<const char*>()))
              .InSequence(s2)
              .WillOnce(Return("dummy"));





              share|improve this answer






















                up vote
                0
                down vote



                accepted







                up vote
                0
                down vote



                accepted






                Just do several WillOnce - one after another.



                Like:



                EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
                .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
                .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));


                You can read in doc that WillOnce can be used several times in one EXPECT_CALL:




                EXPECT_CALL(mock_object, method(matchers))
                .WillOnce(action) *




                The simplified example that works:



                class MockMM

                public:
                MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
                ;

                TEST(A, A)

                MockMM mock;
                EXPECT_CALL(mock, GetSegment(1, _, _, _))
                .WillOnce(SetArgPointee<3>(0))
                .WillOnce(SetArgPointee<3>(1));

                int a;
                int b;
                mock.GetSegment(1, 1, 0, &a);
                mock.GetSegment(1, 0, 1, &b);
                ASSERT_EQ(0, a);
                ASSERT_EQ(1, b);




                You might also use sequences:




                When you have a long chain of sequential expectations, it's easier to
                specify the order using sequences, which don't require you to given
                each expectation in the chain a different name. All expected calls in
                the same sequence must occur in the order they are specified.




                using ::testing::Sequence;
                Sequence s1, s2;
                ...
                EXPECT_CALL(foo, Reset())
                .InSequence(s1, s2)
                .WillOnce(Return(true));
                EXPECT_CALL(foo, GetSize())
                .InSequence(s1)
                .WillOnce(Return(1));
                EXPECT_CALL(foo, Describe(A<const char*>()))
                .InSequence(s2)
                .WillOnce(Return("dummy"));





                share|improve this answer












                Just do several WillOnce - one after another.



                Like:



                EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
                .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
                .WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));


                You can read in doc that WillOnce can be used several times in one EXPECT_CALL:




                EXPECT_CALL(mock_object, method(matchers))
                .WillOnce(action) *




                The simplified example that works:



                class MockMM

                public:
                MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
                ;

                TEST(A, A)

                MockMM mock;
                EXPECT_CALL(mock, GetSegment(1, _, _, _))
                .WillOnce(SetArgPointee<3>(0))
                .WillOnce(SetArgPointee<3>(1));

                int a;
                int b;
                mock.GetSegment(1, 1, 0, &a);
                mock.GetSegment(1, 0, 1, &b);
                ASSERT_EQ(0, a);
                ASSERT_EQ(1, b);




                You might also use sequences:




                When you have a long chain of sequential expectations, it's easier to
                specify the order using sequences, which don't require you to given
                each expectation in the chain a different name. All expected calls in
                the same sequence must occur in the order they are specified.




                using ::testing::Sequence;
                Sequence s1, s2;
                ...
                EXPECT_CALL(foo, Reset())
                .InSequence(s1, s2)
                .WillOnce(Return(true));
                EXPECT_CALL(foo, GetSize())
                .InSequence(s1)
                .WillOnce(Return(1));
                EXPECT_CALL(foo, Describe(A<const char*>()))
                .InSequence(s2)
                .WillOnce(Return("dummy"));






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 14 at 11:38









                PiotrNycz

                15.5k53780




                15.5k53780



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238299%2fhow-can-i-call-my-mock-method-two-times-with-two-different-argument-value%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

                    Syphilis

                    Darth Vader #20