Stub a void method in a Spy object with Spock










3















I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:



1 * classToTest.methodName(_) >> stubbed_return_value


My problem is this: methodName is a void method.
I tried this:



1 * classToTest.methodName(_)


but the actual method is still called.



How do I stub out a void method using Spock?










share|improve this question






















  • Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

    – mike rodent
    Feb 13 '18 at 19:43















3















I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:



1 * classToTest.methodName(_) >> stubbed_return_value


My problem is this: methodName is a void method.
I tried this:



1 * classToTest.methodName(_)


but the actual method is still called.



How do I stub out a void method using Spock?










share|improve this question






















  • Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

    – mike rodent
    Feb 13 '18 at 19:43













3












3








3


1






I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:



1 * classToTest.methodName(_) >> stubbed_return_value


My problem is this: methodName is a void method.
I tried this:



1 * classToTest.methodName(_)


but the actual method is still called.



How do I stub out a void method using Spock?










share|improve this question














I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:



1 * classToTest.methodName(_) >> stubbed_return_value


My problem is this: methodName is a void method.
I tried this:



1 * classToTest.methodName(_)


but the actual method is still called.



How do I stub out a void method using Spock?







java groovy spock






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Feb 28 '17 at 15:25









DwBDwB

29.1k84473




29.1k84473












  • Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

    – mike rodent
    Feb 13 '18 at 19:43

















  • Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

    – mike rodent
    Feb 13 '18 at 19:43
















Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

– mike rodent
Feb 13 '18 at 19:43





Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...

– mike rodent
Feb 13 '18 at 19:43












2 Answers
2






active

oldest

votes


















4














You can just stub it with null...



Given the following Java class:



public class Complex 
private final List<String> sideEffects = new ArrayList<>();

protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);


public int call(String name)
sideEffect(name);
return name.length();


public List<String> getSideEffects()
return sideEffects;




We want to hide the sideEffect method, so nothing is done by it, so we can use the following spec:



class ComplexSpec extends Specification 
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()

when:
int result = complex.call('tim')

then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==







share|improve this answer






























    0














    You could also return an empty closure (instead of a null):



    1 * complex.sideEffect(_) >> 





    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',
      autoActivateHeartbeat: false,
      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%2f42512657%2fstub-a-void-method-in-a-spy-object-with-spock%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      4














      You can just stub it with null...



      Given the following Java class:



      public class Complex 
      private final List<String> sideEffects = new ArrayList<>();

      protected void sideEffect(String name)
      sideEffects.add("Side effect for " + name);


      public int call(String name)
      sideEffect(name);
      return name.length();


      public List<String> getSideEffects()
      return sideEffects;




      We want to hide the sideEffect method, so nothing is done by it, so we can use the following spec:



      class ComplexSpec extends Specification 
      def 'we can ignore void methods in Spies'()
      given:
      Complex complex = Spy()

      when:
      int result = complex.call('tim')

      then:
      result == 3
      1 * complex.sideEffect(_) >> null
      complex.sideEffects ==







      share|improve this answer



























        4














        You can just stub it with null...



        Given the following Java class:



        public class Complex 
        private final List<String> sideEffects = new ArrayList<>();

        protected void sideEffect(String name)
        sideEffects.add("Side effect for " + name);


        public int call(String name)
        sideEffect(name);
        return name.length();


        public List<String> getSideEffects()
        return sideEffects;




        We want to hide the sideEffect method, so nothing is done by it, so we can use the following spec:



        class ComplexSpec extends Specification 
        def 'we can ignore void methods in Spies'()
        given:
        Complex complex = Spy()

        when:
        int result = complex.call('tim')

        then:
        result == 3
        1 * complex.sideEffect(_) >> null
        complex.sideEffects ==







        share|improve this answer

























          4












          4








          4







          You can just stub it with null...



          Given the following Java class:



          public class Complex 
          private final List<String> sideEffects = new ArrayList<>();

          protected void sideEffect(String name)
          sideEffects.add("Side effect for " + name);


          public int call(String name)
          sideEffect(name);
          return name.length();


          public List<String> getSideEffects()
          return sideEffects;




          We want to hide the sideEffect method, so nothing is done by it, so we can use the following spec:



          class ComplexSpec extends Specification 
          def 'we can ignore void methods in Spies'()
          given:
          Complex complex = Spy()

          when:
          int result = complex.call('tim')

          then:
          result == 3
          1 * complex.sideEffect(_) >> null
          complex.sideEffects ==







          share|improve this answer













          You can just stub it with null...



          Given the following Java class:



          public class Complex 
          private final List<String> sideEffects = new ArrayList<>();

          protected void sideEffect(String name)
          sideEffects.add("Side effect for " + name);


          public int call(String name)
          sideEffect(name);
          return name.length();


          public List<String> getSideEffects()
          return sideEffects;




          We want to hide the sideEffect method, so nothing is done by it, so we can use the following spec:



          class ComplexSpec extends Specification 
          def 'we can ignore void methods in Spies'()
          given:
          Complex complex = Spy()

          when:
          int result = complex.call('tim')

          then:
          result == 3
          1 * complex.sideEffect(_) >> null
          complex.sideEffects ==








          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Feb 28 '17 at 16:31









          tim_yatestim_yates

          133k21263277




          133k21263277























              0














              You could also return an empty closure (instead of a null):



              1 * complex.sideEffect(_) >> 





              share|improve this answer



























                0














                You could also return an empty closure (instead of a null):



                1 * complex.sideEffect(_) >> 





                share|improve this answer

























                  0












                  0








                  0







                  You could also return an empty closure (instead of a null):



                  1 * complex.sideEffect(_) >> 





                  share|improve this answer













                  You could also return an empty closure (instead of a null):



                  1 * complex.sideEffect(_) >> 






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 15 '18 at 14:22









                  vadimvadim

                  619923




                  619923



























                      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.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42512657%2fstub-a-void-method-in-a-spy-object-with-spock%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

                      Top Tejano songwriter Luis Silva dead of heart attack at 64

                      ReactJS Fetched API data displays live - need Data displayed static

                      Evgeni Malkin