Creating tests with many mock objects?












0















I'm having doubts about if I should create tests that have many mock objects or not.



I recently read When should I mock? and I'm feeling confused.



Let's take a look at a method I have (it is just to illustrate the problem)



@Override
protected void validate() throws WTException {
Either<ImportError, RootFinderResult> rootPart = getDataValidator().getRootPart();
if (rootPart.isLeft()) {
addValidationMessage(ROOT_PART_NOT_FOUND);
} else if (rootPart.isRight()) {
getObjectsToValidate().forEach(Lambda.uncheckedBiConsumer((part, epmDocuments) -> {
LocalizableMessage rootRevision = getRevision(part);

Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
.filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
.findAny();

wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));
}));
}
}


All of the following methods need to have a connection to a server in order to work, otherwise they will throw errors



getDataValidator().getRootPart();
getRevision(part)
!isSameRevision(rootRevision, epmDocument))


In addition I can't create 'real' objects of part or epm documents. This also requires to have a connection to a server.





So at this point, what I really want to test is actually logic of this part of code



    Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
.filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
.findAny();

wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));


But to test it I need to mock really many objects



@Spy
@InjectMocks
private SameRevision sameRevision;
@Mock
private WTPartRelatedObjectDataValidator wTPartRelatedObjectDataValidator;
@Mock
private ValidationEntry validationEntry;
@Mock
private WTPart rootPart1, rootPart2;
@Mock
private EPMDocument epmDocument1, epmDocument2, epmDocument3;
@Mock
private Either<ImportError, RootFinderResult> rootPart;
@Mock
private LocalizableMessage rootPartRevisionOne, rootPartRevisionTwo;


so finally I can test the logic:



@Test
@DisplayName("Should contain error message when part -> epms revisions are not the same")
void shoulHaveErrorMessagesWhenDifferentRevisions() throws Exception {
doReturn(getMockObjectsToValidate()).when(sameRevision).getObjectsToValidate();

doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
doReturn(false).when(rootPart).isLeft();
doReturn(true).when(rootPart).isRight();

doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);

doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument1);
doReturn(false).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument2);
doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionTwo, epmDocument3);

validationEntry = sameRevision.call();

assertEquals(1, validationEntry.getValidationMessageSet().size());
}


where



    doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
doReturn(false).when(rootPart).isLeft();
doReturn(true).when(rootPart).isRight();

doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);


can be moved to @BeforeEach.





At last, I have my test and it works. It validates what I wanted to be validated but in order to come to this point I had to put a lot of effort to come through the whole API which needs interactions with a server.



What do you guys think, is it worth it to create tests like this? I guess this is a wide-open topic 'cause many newbies that try to come into the 'test world' will have similar a problem, so please do not close the topic because of opinion-based judgement and give your feedback on this topic.










share|improve this question





























    0















    I'm having doubts about if I should create tests that have many mock objects or not.



    I recently read When should I mock? and I'm feeling confused.



    Let's take a look at a method I have (it is just to illustrate the problem)



    @Override
    protected void validate() throws WTException {
    Either<ImportError, RootFinderResult> rootPart = getDataValidator().getRootPart();
    if (rootPart.isLeft()) {
    addValidationMessage(ROOT_PART_NOT_FOUND);
    } else if (rootPart.isRight()) {
    getObjectsToValidate().forEach(Lambda.uncheckedBiConsumer((part, epmDocuments) -> {
    LocalizableMessage rootRevision = getRevision(part);

    Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
    .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
    .findAny();

    wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));
    }));
    }
    }


    All of the following methods need to have a connection to a server in order to work, otherwise they will throw errors



    getDataValidator().getRootPart();
    getRevision(part)
    !isSameRevision(rootRevision, epmDocument))


    In addition I can't create 'real' objects of part or epm documents. This also requires to have a connection to a server.





    So at this point, what I really want to test is actually logic of this part of code



        Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
    .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
    .findAny();

    wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));


    But to test it I need to mock really many objects



    @Spy
    @InjectMocks
    private SameRevision sameRevision;
    @Mock
    private WTPartRelatedObjectDataValidator wTPartRelatedObjectDataValidator;
    @Mock
    private ValidationEntry validationEntry;
    @Mock
    private WTPart rootPart1, rootPart2;
    @Mock
    private EPMDocument epmDocument1, epmDocument2, epmDocument3;
    @Mock
    private Either<ImportError, RootFinderResult> rootPart;
    @Mock
    private LocalizableMessage rootPartRevisionOne, rootPartRevisionTwo;


    so finally I can test the logic:



    @Test
    @DisplayName("Should contain error message when part -> epms revisions are not the same")
    void shoulHaveErrorMessagesWhenDifferentRevisions() throws Exception {
    doReturn(getMockObjectsToValidate()).when(sameRevision).getObjectsToValidate();

    doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
    doReturn(false).when(rootPart).isLeft();
    doReturn(true).when(rootPart).isRight();

    doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
    doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);

    doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument1);
    doReturn(false).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument2);
    doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionTwo, epmDocument3);

    validationEntry = sameRevision.call();

    assertEquals(1, validationEntry.getValidationMessageSet().size());
    }


    where



        doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
    doReturn(false).when(rootPart).isLeft();
    doReturn(true).when(rootPart).isRight();

    doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
    doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);


    can be moved to @BeforeEach.





    At last, I have my test and it works. It validates what I wanted to be validated but in order to come to this point I had to put a lot of effort to come through the whole API which needs interactions with a server.



    What do you guys think, is it worth it to create tests like this? I guess this is a wide-open topic 'cause many newbies that try to come into the 'test world' will have similar a problem, so please do not close the topic because of opinion-based judgement and give your feedback on this topic.










    share|improve this question



























      0












      0








      0








      I'm having doubts about if I should create tests that have many mock objects or not.



      I recently read When should I mock? and I'm feeling confused.



      Let's take a look at a method I have (it is just to illustrate the problem)



      @Override
      protected void validate() throws WTException {
      Either<ImportError, RootFinderResult> rootPart = getDataValidator().getRootPart();
      if (rootPart.isLeft()) {
      addValidationMessage(ROOT_PART_NOT_FOUND);
      } else if (rootPart.isRight()) {
      getObjectsToValidate().forEach(Lambda.uncheckedBiConsumer((part, epmDocuments) -> {
      LocalizableMessage rootRevision = getRevision(part);

      Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
      .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
      .findAny();

      wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));
      }));
      }
      }


      All of the following methods need to have a connection to a server in order to work, otherwise they will throw errors



      getDataValidator().getRootPart();
      getRevision(part)
      !isSameRevision(rootRevision, epmDocument))


      In addition I can't create 'real' objects of part or epm documents. This also requires to have a connection to a server.





      So at this point, what I really want to test is actually logic of this part of code



          Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
      .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
      .findAny();

      wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));


      But to test it I need to mock really many objects



      @Spy
      @InjectMocks
      private SameRevision sameRevision;
      @Mock
      private WTPartRelatedObjectDataValidator wTPartRelatedObjectDataValidator;
      @Mock
      private ValidationEntry validationEntry;
      @Mock
      private WTPart rootPart1, rootPart2;
      @Mock
      private EPMDocument epmDocument1, epmDocument2, epmDocument3;
      @Mock
      private Either<ImportError, RootFinderResult> rootPart;
      @Mock
      private LocalizableMessage rootPartRevisionOne, rootPartRevisionTwo;


      so finally I can test the logic:



      @Test
      @DisplayName("Should contain error message when part -> epms revisions are not the same")
      void shoulHaveErrorMessagesWhenDifferentRevisions() throws Exception {
      doReturn(getMockObjectsToValidate()).when(sameRevision).getObjectsToValidate();

      doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
      doReturn(false).when(rootPart).isLeft();
      doReturn(true).when(rootPart).isRight();

      doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
      doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);

      doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument1);
      doReturn(false).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument2);
      doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionTwo, epmDocument3);

      validationEntry = sameRevision.call();

      assertEquals(1, validationEntry.getValidationMessageSet().size());
      }


      where



          doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
      doReturn(false).when(rootPart).isLeft();
      doReturn(true).when(rootPart).isRight();

      doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
      doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);


      can be moved to @BeforeEach.





      At last, I have my test and it works. It validates what I wanted to be validated but in order to come to this point I had to put a lot of effort to come through the whole API which needs interactions with a server.



      What do you guys think, is it worth it to create tests like this? I guess this is a wide-open topic 'cause many newbies that try to come into the 'test world' will have similar a problem, so please do not close the topic because of opinion-based judgement and give your feedback on this topic.










      share|improve this question
















      I'm having doubts about if I should create tests that have many mock objects or not.



      I recently read When should I mock? and I'm feeling confused.



      Let's take a look at a method I have (it is just to illustrate the problem)



      @Override
      protected void validate() throws WTException {
      Either<ImportError, RootFinderResult> rootPart = getDataValidator().getRootPart();
      if (rootPart.isLeft()) {
      addValidationMessage(ROOT_PART_NOT_FOUND);
      } else if (rootPart.isRight()) {
      getObjectsToValidate().forEach(Lambda.uncheckedBiConsumer((part, epmDocuments) -> {
      LocalizableMessage rootRevision = getRevision(part);

      Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
      .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
      .findAny();

      wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));
      }));
      }
      }


      All of the following methods need to have a connection to a server in order to work, otherwise they will throw errors



      getDataValidator().getRootPart();
      getRevision(part)
      !isSameRevision(rootRevision, epmDocument))


      In addition I can't create 'real' objects of part or epm documents. This also requires to have a connection to a server.





      So at this point, what I really want to test is actually logic of this part of code



          Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
      .filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
      .findAny();

      wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));


      But to test it I need to mock really many objects



      @Spy
      @InjectMocks
      private SameRevision sameRevision;
      @Mock
      private WTPartRelatedObjectDataValidator wTPartRelatedObjectDataValidator;
      @Mock
      private ValidationEntry validationEntry;
      @Mock
      private WTPart rootPart1, rootPart2;
      @Mock
      private EPMDocument epmDocument1, epmDocument2, epmDocument3;
      @Mock
      private Either<ImportError, RootFinderResult> rootPart;
      @Mock
      private LocalizableMessage rootPartRevisionOne, rootPartRevisionTwo;


      so finally I can test the logic:



      @Test
      @DisplayName("Should contain error message when part -> epms revisions are not the same")
      void shoulHaveErrorMessagesWhenDifferentRevisions() throws Exception {
      doReturn(getMockObjectsToValidate()).when(sameRevision).getObjectsToValidate();

      doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
      doReturn(false).when(rootPart).isLeft();
      doReturn(true).when(rootPart).isRight();

      doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
      doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);

      doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument1);
      doReturn(false).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument2);
      doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionTwo, epmDocument3);

      validationEntry = sameRevision.call();

      assertEquals(1, validationEntry.getValidationMessageSet().size());
      }


      where



          doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
      doReturn(false).when(rootPart).isLeft();
      doReturn(true).when(rootPart).isRight();

      doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
      doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);


      can be moved to @BeforeEach.





      At last, I have my test and it works. It validates what I wanted to be validated but in order to come to this point I had to put a lot of effort to come through the whole API which needs interactions with a server.



      What do you guys think, is it worth it to create tests like this? I guess this is a wide-open topic 'cause many newbies that try to come into the 'test world' will have similar a problem, so please do not close the topic because of opinion-based judgement and give your feedback on this topic.







      java testing junit mocking ptc-windchill






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 14 '18 at 10:09









      tom1299

      618




      618










      asked Nov 14 '18 at 9:14









      AramkaAramka

      296




      296
























          3 Answers
          3






          active

          oldest

          votes


















          1














          You are right. It is a big effort to mock all those dependencies. Let me get over a few points that may make things clearer:




          • Treat writing tests like an investment: So yes, sometimes it is more effort to write the test than to write the actual code. However, you will thank yourself later when you introduce a bug and the tests can catch it. Having good tests gives you confidence when modifying your code that you didn't break anything, and if you did, your tests will find the issue. It pays off over time.


          • Keep your test focused on a specific class. Mock the rest: When you mock everything except the class under test, you can be sure that when a problem occurs that it is from the class under test, and not from one of its dependencies. This makes troubleshooting a lot easier.


          • Think of testability when writing new code: Sometimes it may not be avoidable to have a complicated piece of code which is hard to test. However, generally, this situation can be avoided by keeping the number of dependencies you have to a minimum and writing testable code. For example, if a method needs 5 or 6 more dependencies to do its job, then probably that method is doing too much and could be broken down. Same thing can be said on a class level, modules, etc..







          share|improve this answer































            1














            You should mock other dependencies on which your class which going to be tested relies and set up behavior which you need .
            This needs to be done to test your method isolated and not dependent on thrirdparty classes
            You can write private void methods which can contain your mock behavior and use them in tests ,
            In @BeforeEach annotated method you could mock behavior which wil be same in all tests or mock the same mocking behavior for across all tests



            In your method which is void you can have spy objects which can be veereified if they were called like Mockito.verify()






            share|improve this answer

































              0














              Yes, it is quite time investing when you have to mock so many things.
              In my opinion, if you add some value when testing something, it is worth testing, the problem could be of course how much time would you consume.



              In your specific case, I would test on different "layers".



              For example, the methods:
              getDataValidator().getRootPart();
              getRevision(part)
              !isSameRevision(rootRevision, epmDocument))



              They can be independently tested and in your case just mock their result, meaning that you don't really care about the parameters there, you just care what happens in case of a certain return value.



              So, on one layer you really test the functionality, on the next layer you just mock the result you need, in order to test the other functionality.



              I hope it is more clear now...






              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%2f53296583%2fcreating-tests-with-many-mock-objects%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                1














                You are right. It is a big effort to mock all those dependencies. Let me get over a few points that may make things clearer:




                • Treat writing tests like an investment: So yes, sometimes it is more effort to write the test than to write the actual code. However, you will thank yourself later when you introduce a bug and the tests can catch it. Having good tests gives you confidence when modifying your code that you didn't break anything, and if you did, your tests will find the issue. It pays off over time.


                • Keep your test focused on a specific class. Mock the rest: When you mock everything except the class under test, you can be sure that when a problem occurs that it is from the class under test, and not from one of its dependencies. This makes troubleshooting a lot easier.


                • Think of testability when writing new code: Sometimes it may not be avoidable to have a complicated piece of code which is hard to test. However, generally, this situation can be avoided by keeping the number of dependencies you have to a minimum and writing testable code. For example, if a method needs 5 or 6 more dependencies to do its job, then probably that method is doing too much and could be broken down. Same thing can be said on a class level, modules, etc..







                share|improve this answer




























                  1














                  You are right. It is a big effort to mock all those dependencies. Let me get over a few points that may make things clearer:




                  • Treat writing tests like an investment: So yes, sometimes it is more effort to write the test than to write the actual code. However, you will thank yourself later when you introduce a bug and the tests can catch it. Having good tests gives you confidence when modifying your code that you didn't break anything, and if you did, your tests will find the issue. It pays off over time.


                  • Keep your test focused on a specific class. Mock the rest: When you mock everything except the class under test, you can be sure that when a problem occurs that it is from the class under test, and not from one of its dependencies. This makes troubleshooting a lot easier.


                  • Think of testability when writing new code: Sometimes it may not be avoidable to have a complicated piece of code which is hard to test. However, generally, this situation can be avoided by keeping the number of dependencies you have to a minimum and writing testable code. For example, if a method needs 5 or 6 more dependencies to do its job, then probably that method is doing too much and could be broken down. Same thing can be said on a class level, modules, etc..







                  share|improve this answer


























                    1












                    1








                    1







                    You are right. It is a big effort to mock all those dependencies. Let me get over a few points that may make things clearer:




                    • Treat writing tests like an investment: So yes, sometimes it is more effort to write the test than to write the actual code. However, you will thank yourself later when you introduce a bug and the tests can catch it. Having good tests gives you confidence when modifying your code that you didn't break anything, and if you did, your tests will find the issue. It pays off over time.


                    • Keep your test focused on a specific class. Mock the rest: When you mock everything except the class under test, you can be sure that when a problem occurs that it is from the class under test, and not from one of its dependencies. This makes troubleshooting a lot easier.


                    • Think of testability when writing new code: Sometimes it may not be avoidable to have a complicated piece of code which is hard to test. However, generally, this situation can be avoided by keeping the number of dependencies you have to a minimum and writing testable code. For example, if a method needs 5 or 6 more dependencies to do its job, then probably that method is doing too much and could be broken down. Same thing can be said on a class level, modules, etc..







                    share|improve this answer













                    You are right. It is a big effort to mock all those dependencies. Let me get over a few points that may make things clearer:




                    • Treat writing tests like an investment: So yes, sometimes it is more effort to write the test than to write the actual code. However, you will thank yourself later when you introduce a bug and the tests can catch it. Having good tests gives you confidence when modifying your code that you didn't break anything, and if you did, your tests will find the issue. It pays off over time.


                    • Keep your test focused on a specific class. Mock the rest: When you mock everything except the class under test, you can be sure that when a problem occurs that it is from the class under test, and not from one of its dependencies. This makes troubleshooting a lot easier.


                    • Think of testability when writing new code: Sometimes it may not be avoidable to have a complicated piece of code which is hard to test. However, generally, this situation can be avoided by keeping the number of dependencies you have to a minimum and writing testable code. For example, if a method needs 5 or 6 more dependencies to do its job, then probably that method is doing too much and could be broken down. Same thing can be said on a class level, modules, etc..








                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 14 '18 at 10:39









                    A.EbrahimA.Ebrahim

                    1986




                    1986

























                        1














                        You should mock other dependencies on which your class which going to be tested relies and set up behavior which you need .
                        This needs to be done to test your method isolated and not dependent on thrirdparty classes
                        You can write private void methods which can contain your mock behavior and use them in tests ,
                        In @BeforeEach annotated method you could mock behavior which wil be same in all tests or mock the same mocking behavior for across all tests



                        In your method which is void you can have spy objects which can be veereified if they were called like Mockito.verify()






                        share|improve this answer






























                          1














                          You should mock other dependencies on which your class which going to be tested relies and set up behavior which you need .
                          This needs to be done to test your method isolated and not dependent on thrirdparty classes
                          You can write private void methods which can contain your mock behavior and use them in tests ,
                          In @BeforeEach annotated method you could mock behavior which wil be same in all tests or mock the same mocking behavior for across all tests



                          In your method which is void you can have spy objects which can be veereified if they were called like Mockito.verify()






                          share|improve this answer




























                            1












                            1








                            1







                            You should mock other dependencies on which your class which going to be tested relies and set up behavior which you need .
                            This needs to be done to test your method isolated and not dependent on thrirdparty classes
                            You can write private void methods which can contain your mock behavior and use them in tests ,
                            In @BeforeEach annotated method you could mock behavior which wil be same in all tests or mock the same mocking behavior for across all tests



                            In your method which is void you can have spy objects which can be veereified if they were called like Mockito.verify()






                            share|improve this answer















                            You should mock other dependencies on which your class which going to be tested relies and set up behavior which you need .
                            This needs to be done to test your method isolated and not dependent on thrirdparty classes
                            You can write private void methods which can contain your mock behavior and use them in tests ,
                            In @BeforeEach annotated method you could mock behavior which wil be same in all tests or mock the same mocking behavior for across all tests



                            In your method which is void you can have spy objects which can be veereified if they were called like Mockito.verify()







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Nov 14 '18 at 9:29

























                            answered Nov 14 '18 at 9:24









                            Mykhailo MoskuraMykhailo Moskura

                            838113




                            838113























                                0














                                Yes, it is quite time investing when you have to mock so many things.
                                In my opinion, if you add some value when testing something, it is worth testing, the problem could be of course how much time would you consume.



                                In your specific case, I would test on different "layers".



                                For example, the methods:
                                getDataValidator().getRootPart();
                                getRevision(part)
                                !isSameRevision(rootRevision, epmDocument))



                                They can be independently tested and in your case just mock their result, meaning that you don't really care about the parameters there, you just care what happens in case of a certain return value.



                                So, on one layer you really test the functionality, on the next layer you just mock the result you need, in order to test the other functionality.



                                I hope it is more clear now...






                                share|improve this answer




























                                  0














                                  Yes, it is quite time investing when you have to mock so many things.
                                  In my opinion, if you add some value when testing something, it is worth testing, the problem could be of course how much time would you consume.



                                  In your specific case, I would test on different "layers".



                                  For example, the methods:
                                  getDataValidator().getRootPart();
                                  getRevision(part)
                                  !isSameRevision(rootRevision, epmDocument))



                                  They can be independently tested and in your case just mock their result, meaning that you don't really care about the parameters there, you just care what happens in case of a certain return value.



                                  So, on one layer you really test the functionality, on the next layer you just mock the result you need, in order to test the other functionality.



                                  I hope it is more clear now...






                                  share|improve this answer


























                                    0












                                    0








                                    0







                                    Yes, it is quite time investing when you have to mock so many things.
                                    In my opinion, if you add some value when testing something, it is worth testing, the problem could be of course how much time would you consume.



                                    In your specific case, I would test on different "layers".



                                    For example, the methods:
                                    getDataValidator().getRootPart();
                                    getRevision(part)
                                    !isSameRevision(rootRevision, epmDocument))



                                    They can be independently tested and in your case just mock their result, meaning that you don't really care about the parameters there, you just care what happens in case of a certain return value.



                                    So, on one layer you really test the functionality, on the next layer you just mock the result you need, in order to test the other functionality.



                                    I hope it is more clear now...






                                    share|improve this answer













                                    Yes, it is quite time investing when you have to mock so many things.
                                    In my opinion, if you add some value when testing something, it is worth testing, the problem could be of course how much time would you consume.



                                    In your specific case, I would test on different "layers".



                                    For example, the methods:
                                    getDataValidator().getRootPart();
                                    getRevision(part)
                                    !isSameRevision(rootRevision, epmDocument))



                                    They can be independently tested and in your case just mock their result, meaning that you don't really care about the parameters there, you just care what happens in case of a certain return value.



                                    So, on one layer you really test the functionality, on the next layer you just mock the result you need, in order to test the other functionality.



                                    I hope it is more clear now...







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Nov 14 '18 at 9:27









                                    Andrea CalinAndrea Calin

                                    1789




                                    1789






























                                        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%2f53296583%2fcreating-tests-with-many-mock-objects%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

                                        Xamarin.iOS Cant Deploy on Iphone

                                        Glorious Revolution

                                        Dulmage-Mendelsohn matrix decomposition in Python