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

      104k14109177




      104k14109177










      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,55731835




                4,55731835






























                     

                    draft saved


                    draft discarded



















































                     


                    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

                    Xamarin.iOS Cant Deploy on Iphone

                    Glorious Revolution

                    Dulmage-Mendelsohn matrix decomposition in Python