Junit Mocking throwing Null pointer











up vote
1
down vote

favorite
1












I'm trying to mock the below service class.



I have created a separate Config bean which I'm calling as you can see below in the code:-



@Component
public class CrawlerService implements CrawlerServiceInterface {

private static final Logger LOGGER = LoggerFactory.getLogger(CrawlerService.class);

private final CrawlConfig config;

@Autowired
CrawlerFactory crawlerFactory;

@Autowired
public CrawlerService(@Qualifier(value = "CrawlerConfig") CrawlConfig config) {
this.config = config;
}

@Value("${com.prudential.noOfCrawlers}")
private int numberOfCrawlers;

@Override
public Object crawlService(String URL, int max) throws Exception {

LOGGER.info("In Service Class");

this.config.setMaxPagesToFetch(max);

PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

controller.addSeed(URL);
controller.start(crawlerFactory, numberOfCrawlers);

List<Object> crawlersLocalData = controller.getCrawlersLocalData();

LOGGER.info("End of Service Class");
return crawlersLocalData;

}

}


The problem is that I'm getting a null pointer exception in this.config.setMaxPagesToFetch.



What am I doing wrong?



If I mocked some dependent object with @Mock annotation, does it mean it won't allow the value to be changed?



Here is the test class:-



List<Object> obj=new ArrayList<Object>();

@Mock
private CrawlConfig config;

@Mock
CrawlerFactory crawlerFactory;

@Mock
CrawlController controller;

@InjectMocks
CrawlerService crawlerService = new CrawlerService(config);

@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}

@Test
public void testService() throws Exception {
when(controller.getCrawlersLocalData()).thenReturn(obj);

assertEquals(crawlerService.crawlService("https://vogella.com", 10), obj);

}









share|improve this question




























    up vote
    1
    down vote

    favorite
    1












    I'm trying to mock the below service class.



    I have created a separate Config bean which I'm calling as you can see below in the code:-



    @Component
    public class CrawlerService implements CrawlerServiceInterface {

    private static final Logger LOGGER = LoggerFactory.getLogger(CrawlerService.class);

    private final CrawlConfig config;

    @Autowired
    CrawlerFactory crawlerFactory;

    @Autowired
    public CrawlerService(@Qualifier(value = "CrawlerConfig") CrawlConfig config) {
    this.config = config;
    }

    @Value("${com.prudential.noOfCrawlers}")
    private int numberOfCrawlers;

    @Override
    public Object crawlService(String URL, int max) throws Exception {

    LOGGER.info("In Service Class");

    this.config.setMaxPagesToFetch(max);

    PageFetcher pageFetcher = new PageFetcher(config);
    RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
    RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
    CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

    controller.addSeed(URL);
    controller.start(crawlerFactory, numberOfCrawlers);

    List<Object> crawlersLocalData = controller.getCrawlersLocalData();

    LOGGER.info("End of Service Class");
    return crawlersLocalData;

    }

    }


    The problem is that I'm getting a null pointer exception in this.config.setMaxPagesToFetch.



    What am I doing wrong?



    If I mocked some dependent object with @Mock annotation, does it mean it won't allow the value to be changed?



    Here is the test class:-



    List<Object> obj=new ArrayList<Object>();

    @Mock
    private CrawlConfig config;

    @Mock
    CrawlerFactory crawlerFactory;

    @Mock
    CrawlController controller;

    @InjectMocks
    CrawlerService crawlerService = new CrawlerService(config);

    @Before
    public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testService() throws Exception {
    when(controller.getCrawlersLocalData()).thenReturn(obj);

    assertEquals(crawlerService.crawlService("https://vogella.com", 10), obj);

    }









    share|improve this question


























      up vote
      1
      down vote

      favorite
      1









      up vote
      1
      down vote

      favorite
      1






      1





      I'm trying to mock the below service class.



      I have created a separate Config bean which I'm calling as you can see below in the code:-



      @Component
      public class CrawlerService implements CrawlerServiceInterface {

      private static final Logger LOGGER = LoggerFactory.getLogger(CrawlerService.class);

      private final CrawlConfig config;

      @Autowired
      CrawlerFactory crawlerFactory;

      @Autowired
      public CrawlerService(@Qualifier(value = "CrawlerConfig") CrawlConfig config) {
      this.config = config;
      }

      @Value("${com.prudential.noOfCrawlers}")
      private int numberOfCrawlers;

      @Override
      public Object crawlService(String URL, int max) throws Exception {

      LOGGER.info("In Service Class");

      this.config.setMaxPagesToFetch(max);

      PageFetcher pageFetcher = new PageFetcher(config);
      RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
      RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
      CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

      controller.addSeed(URL);
      controller.start(crawlerFactory, numberOfCrawlers);

      List<Object> crawlersLocalData = controller.getCrawlersLocalData();

      LOGGER.info("End of Service Class");
      return crawlersLocalData;

      }

      }


      The problem is that I'm getting a null pointer exception in this.config.setMaxPagesToFetch.



      What am I doing wrong?



      If I mocked some dependent object with @Mock annotation, does it mean it won't allow the value to be changed?



      Here is the test class:-



      List<Object> obj=new ArrayList<Object>();

      @Mock
      private CrawlConfig config;

      @Mock
      CrawlerFactory crawlerFactory;

      @Mock
      CrawlController controller;

      @InjectMocks
      CrawlerService crawlerService = new CrawlerService(config);

      @Before
      public void setUp() throws Exception {
      MockitoAnnotations.initMocks(this);
      }

      @Test
      public void testService() throws Exception {
      when(controller.getCrawlersLocalData()).thenReturn(obj);

      assertEquals(crawlerService.crawlService("https://vogella.com", 10), obj);

      }









      share|improve this question















      I'm trying to mock the below service class.



      I have created a separate Config bean which I'm calling as you can see below in the code:-



      @Component
      public class CrawlerService implements CrawlerServiceInterface {

      private static final Logger LOGGER = LoggerFactory.getLogger(CrawlerService.class);

      private final CrawlConfig config;

      @Autowired
      CrawlerFactory crawlerFactory;

      @Autowired
      public CrawlerService(@Qualifier(value = "CrawlerConfig") CrawlConfig config) {
      this.config = config;
      }

      @Value("${com.prudential.noOfCrawlers}")
      private int numberOfCrawlers;

      @Override
      public Object crawlService(String URL, int max) throws Exception {

      LOGGER.info("In Service Class");

      this.config.setMaxPagesToFetch(max);

      PageFetcher pageFetcher = new PageFetcher(config);
      RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
      RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
      CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

      controller.addSeed(URL);
      controller.start(crawlerFactory, numberOfCrawlers);

      List<Object> crawlersLocalData = controller.getCrawlersLocalData();

      LOGGER.info("End of Service Class");
      return crawlersLocalData;

      }

      }


      The problem is that I'm getting a null pointer exception in this.config.setMaxPagesToFetch.



      What am I doing wrong?



      If I mocked some dependent object with @Mock annotation, does it mean it won't allow the value to be changed?



      Here is the test class:-



      List<Object> obj=new ArrayList<Object>();

      @Mock
      private CrawlConfig config;

      @Mock
      CrawlerFactory crawlerFactory;

      @Mock
      CrawlController controller;

      @InjectMocks
      CrawlerService crawlerService = new CrawlerService(config);

      @Before
      public void setUp() throws Exception {
      MockitoAnnotations.initMocks(this);
      }

      @Test
      public void testService() throws Exception {
      when(controller.getCrawlersLocalData()).thenReturn(obj);

      assertEquals(crawlerService.crawlService("https://vogella.com", 10), obj);

      }






      junit mockito






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 10 at 22:18









      Nkosi

      106k15111180




      106k15111180










      asked Nov 10 at 22:14









      Arunava Paul

      356




      356
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          Here you have the problem with mock creating order. First of all, let's see what is happening here:




          • First, you are declaring some fields. In this case, you are declaring private CrawlConfig config and CrawlerService crawlerService. But crawlerService you don't just declare but initialize as well.

          • When you initialize it, you are passing as a dependency to it CrawlConfig config which is null.

          • Then MockitoAnnotations.initMocks(this) start doing it's magic. What does it do? It initializes all the fields annotated with @Mock, then it tries to initialize the @InjectMocks if it's not already initialized. In your case it is already initialized, so mockito won't initialize it and will use the instance which you created.

          • After that the mock injection takes part. Mockito will try to use any of it's strategy to inject mocks. You can read more about it in @InjectMocks javadoc. So in your case, mockito will try to use property setter or field injection. However, the CrawlConfig config in your CrawlerService is declared final, and mockito will ignore this field, as for this type of injection mockito ignores final or static fields.


          So here you have created an instance of CrawlerService with dependency CrawlConfig config which is null and mockito won't do anything about it.



          1) You can mock the CrawlConfig config by yourself before mockito is going to:



          private CrawlConfig config = Mockito.mock(CrawlConfig.class);

          @InjectMocks
          CrawlerService crawlerService = new CrawlerService(config);


          2) You can omit the initialization of the CrawlerService and rely on mockito:



          @Mock
          private CrawlConfig config = Mockito.mock(CrawlConfig.class);

          @InjectMocks
          CrawlerService crawlerService;


          Each of these methods should work.



          You can as well remove the final declaration from your CrawlerService and it will also work. But as for me, the two methods above are better options.






          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%2f53243958%2fjunit-mocking-throwing-null-pointer%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













            Here you have the problem with mock creating order. First of all, let's see what is happening here:




            • First, you are declaring some fields. In this case, you are declaring private CrawlConfig config and CrawlerService crawlerService. But crawlerService you don't just declare but initialize as well.

            • When you initialize it, you are passing as a dependency to it CrawlConfig config which is null.

            • Then MockitoAnnotations.initMocks(this) start doing it's magic. What does it do? It initializes all the fields annotated with @Mock, then it tries to initialize the @InjectMocks if it's not already initialized. In your case it is already initialized, so mockito won't initialize it and will use the instance which you created.

            • After that the mock injection takes part. Mockito will try to use any of it's strategy to inject mocks. You can read more about it in @InjectMocks javadoc. So in your case, mockito will try to use property setter or field injection. However, the CrawlConfig config in your CrawlerService is declared final, and mockito will ignore this field, as for this type of injection mockito ignores final or static fields.


            So here you have created an instance of CrawlerService with dependency CrawlConfig config which is null and mockito won't do anything about it.



            1) You can mock the CrawlConfig config by yourself before mockito is going to:



            private CrawlConfig config = Mockito.mock(CrawlConfig.class);

            @InjectMocks
            CrawlerService crawlerService = new CrawlerService(config);


            2) You can omit the initialization of the CrawlerService and rely on mockito:



            @Mock
            private CrawlConfig config = Mockito.mock(CrawlConfig.class);

            @InjectMocks
            CrawlerService crawlerService;


            Each of these methods should work.



            You can as well remove the final declaration from your CrawlerService and it will also work. But as for me, the two methods above are better options.






            share|improve this answer

























              up vote
              0
              down vote













              Here you have the problem with mock creating order. First of all, let's see what is happening here:




              • First, you are declaring some fields. In this case, you are declaring private CrawlConfig config and CrawlerService crawlerService. But crawlerService you don't just declare but initialize as well.

              • When you initialize it, you are passing as a dependency to it CrawlConfig config which is null.

              • Then MockitoAnnotations.initMocks(this) start doing it's magic. What does it do? It initializes all the fields annotated with @Mock, then it tries to initialize the @InjectMocks if it's not already initialized. In your case it is already initialized, so mockito won't initialize it and will use the instance which you created.

              • After that the mock injection takes part. Mockito will try to use any of it's strategy to inject mocks. You can read more about it in @InjectMocks javadoc. So in your case, mockito will try to use property setter or field injection. However, the CrawlConfig config in your CrawlerService is declared final, and mockito will ignore this field, as for this type of injection mockito ignores final or static fields.


              So here you have created an instance of CrawlerService with dependency CrawlConfig config which is null and mockito won't do anything about it.



              1) You can mock the CrawlConfig config by yourself before mockito is going to:



              private CrawlConfig config = Mockito.mock(CrawlConfig.class);

              @InjectMocks
              CrawlerService crawlerService = new CrawlerService(config);


              2) You can omit the initialization of the CrawlerService and rely on mockito:



              @Mock
              private CrawlConfig config = Mockito.mock(CrawlConfig.class);

              @InjectMocks
              CrawlerService crawlerService;


              Each of these methods should work.



              You can as well remove the final declaration from your CrawlerService and it will also work. But as for me, the two methods above are better options.






              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                Here you have the problem with mock creating order. First of all, let's see what is happening here:




                • First, you are declaring some fields. In this case, you are declaring private CrawlConfig config and CrawlerService crawlerService. But crawlerService you don't just declare but initialize as well.

                • When you initialize it, you are passing as a dependency to it CrawlConfig config which is null.

                • Then MockitoAnnotations.initMocks(this) start doing it's magic. What does it do? It initializes all the fields annotated with @Mock, then it tries to initialize the @InjectMocks if it's not already initialized. In your case it is already initialized, so mockito won't initialize it and will use the instance which you created.

                • After that the mock injection takes part. Mockito will try to use any of it's strategy to inject mocks. You can read more about it in @InjectMocks javadoc. So in your case, mockito will try to use property setter or field injection. However, the CrawlConfig config in your CrawlerService is declared final, and mockito will ignore this field, as for this type of injection mockito ignores final or static fields.


                So here you have created an instance of CrawlerService with dependency CrawlConfig config which is null and mockito won't do anything about it.



                1) You can mock the CrawlConfig config by yourself before mockito is going to:



                private CrawlConfig config = Mockito.mock(CrawlConfig.class);

                @InjectMocks
                CrawlerService crawlerService = new CrawlerService(config);


                2) You can omit the initialization of the CrawlerService and rely on mockito:



                @Mock
                private CrawlConfig config = Mockito.mock(CrawlConfig.class);

                @InjectMocks
                CrawlerService crawlerService;


                Each of these methods should work.



                You can as well remove the final declaration from your CrawlerService and it will also work. But as for me, the two methods above are better options.






                share|improve this answer












                Here you have the problem with mock creating order. First of all, let's see what is happening here:




                • First, you are declaring some fields. In this case, you are declaring private CrawlConfig config and CrawlerService crawlerService. But crawlerService you don't just declare but initialize as well.

                • When you initialize it, you are passing as a dependency to it CrawlConfig config which is null.

                • Then MockitoAnnotations.initMocks(this) start doing it's magic. What does it do? It initializes all the fields annotated with @Mock, then it tries to initialize the @InjectMocks if it's not already initialized. In your case it is already initialized, so mockito won't initialize it and will use the instance which you created.

                • After that the mock injection takes part. Mockito will try to use any of it's strategy to inject mocks. You can read more about it in @InjectMocks javadoc. So in your case, mockito will try to use property setter or field injection. However, the CrawlConfig config in your CrawlerService is declared final, and mockito will ignore this field, as for this type of injection mockito ignores final or static fields.


                So here you have created an instance of CrawlerService with dependency CrawlConfig config which is null and mockito won't do anything about it.



                1) You can mock the CrawlConfig config by yourself before mockito is going to:



                private CrawlConfig config = Mockito.mock(CrawlConfig.class);

                @InjectMocks
                CrawlerService crawlerService = new CrawlerService(config);


                2) You can omit the initialization of the CrawlerService and rely on mockito:



                @Mock
                private CrawlConfig config = Mockito.mock(CrawlConfig.class);

                @InjectMocks
                CrawlerService crawlerService;


                Each of these methods should work.



                You can as well remove the final declaration from your CrawlerService and it will also work. But as for me, the two methods above are better options.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 12 at 10:08









                Sergii Bishyr

                4,58731935




                4,58731935






























                    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%2f53243958%2fjunit-mocking-throwing-null-pointer%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

                    鏡平學校

                    ꓛꓣだゔៀៅຸ໢ທຮ໕໒ ,ໂ'໥໓າ໼ឨឲ៵៭ៈゎゔit''䖳𥁄卿' ☨₤₨こゎもょの;ꜹꟚꞖꞵꟅꞛေၦေɯ,ɨɡ𛃵𛁹ޝ޳ޠ޾,ޤޒޯ޾𫝒𫠁သ𛅤チョ'サノބޘދ𛁐ᶿᶇᶀᶋᶠ㨑㽹⻮ꧬ꧹؍۩وَؠ㇕㇃㇪ ㇦㇋㇋ṜẰᵡᴠ 軌ᵕ搜۳ٰޗޮ޷ސޯ𫖾𫅀ल, ꙭ꙰ꚅꙁꚊꞻꝔ꟠Ꝭㄤﺟޱސꧨꧼ꧴ꧯꧽ꧲ꧯ'⽹⽭⾁⿞⼳⽋២៩ញណើꩯꩤ꩸ꩮᶻᶺᶧᶂ𫳲𫪭𬸄𫵰𬖩𬫣𬊉ၲ𛅬㕦䬺𫝌𫝼,,𫟖𫞽ហៅ஫㆔ాఆఅꙒꚞꙍ,Ꙟ꙱エ ,ポテ,フࢰࢯ𫟠𫞶 𫝤𫟠ﺕﹱﻜﻣ𪵕𪭸𪻆𪾩𫔷ġ,ŧآꞪ꟥,ꞔꝻ♚☹⛵𛀌ꬷꭞȄƁƪƬșƦǙǗdžƝǯǧⱦⱰꓕꓢႋ神 ဴ၀க௭எ௫ឫោ ' េㇷㇴㇼ神ㇸㇲㇽㇴㇼㇻㇸ'ㇸㇿㇸㇹㇰㆣꓚꓤ₡₧ ㄨㄟ㄂ㄖㄎ໗ツڒذ₶।ऩछएोञयूटक़कयँृी,冬'𛅢𛅥ㇱㇵㇶ𥄥𦒽𠣧𠊓𧢖𥞘𩔋цѰㄠſtʯʭɿʆʗʍʩɷɛ,əʏダヵㄐㄘR{gỚṖḺờṠṫảḙḭᴮᵏᴘᵀᵷᵕᴜᴏᵾq﮲ﲿﴽﭙ軌ﰬﶚﶧ﫲Ҝжюїкӈㇴffצּ﬘﭅﬈軌'ffistfflſtffतभफɳɰʊɲʎ𛁱𛁖𛁮𛀉 𛂯𛀞నఋŀŲ 𫟲𫠖𫞺ຆຆ ໹້໕໗ๆทԊꧢꧠ꧰ꓱ⿝⼑ŎḬẃẖỐẅ ,ờỰỈỗﮊDžȩꭏꭎꬻ꭮ꬿꭖꭥꭅ㇭神 ⾈ꓵꓑ⺄㄄ㄪㄙㄅㄇstA۵䞽ॶ𫞑𫝄㇉㇇゜軌𩜛𩳠Jﻺ‚Üမ႕ႌႊၐၸဓၞၞၡ៸wyvtᶎᶪᶹစဎ꣡꣰꣢꣤ٗ؋لㇳㇾㇻㇱ㆐㆔,,㆟Ⱶヤマފ޼ޝަݿݞݠݷݐ',ݘ,ݪݙݵ𬝉𬜁𫝨𫞘くせぉて¼óû×ó£…𛅑הㄙくԗԀ5606神45,神796'𪤻𫞧ꓐ㄁ㄘɥɺꓵꓲ3''7034׉ⱦⱠˆ“𫝋ȍ,ꩲ軌꩷ꩶꩧꩫఞ۔فڱێظペサ神ナᴦᵑ47 9238їﻂ䐊䔉㠸﬎ffiﬣ,לּᴷᴦᵛᵽ,ᴨᵤ ᵸᵥᴗᵈꚏꚉꚟ⻆rtǟƴ𬎎

                    Why https connections are so slow when debugging (stepping over) in Java?