Junit Mocking throwing Null pointer
up vote
1
down vote
favorite
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
add a comment |
up vote
1
down vote
favorite
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
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
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
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
junit mockito
edited Nov 10 at 22:18
Nkosi
104k14109177
104k14109177
asked Nov 10 at 22:14
Arunava Paul
356
356
add a comment |
add a comment |
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
andCrawlerService crawlerService
. ButcrawlerService
you don't just declare but initialize as well. - When you initialize it, you are passing as a dependency to it
CrawlConfig config
which isnull
. - 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, theCrawlConfig config
in yourCrawlerService
is declaredfinal
, andmockito
will ignore this field, as for this type of injectionmockito
ignoresfinal
orstatic
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.
add a comment |
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
andCrawlerService crawlerService
. ButcrawlerService
you don't just declare but initialize as well. - When you initialize it, you are passing as a dependency to it
CrawlConfig config
which isnull
. - 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, theCrawlConfig config
in yourCrawlerService
is declaredfinal
, andmockito
will ignore this field, as for this type of injectionmockito
ignoresfinal
orstatic
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.
add a comment |
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
andCrawlerService crawlerService
. ButcrawlerService
you don't just declare but initialize as well. - When you initialize it, you are passing as a dependency to it
CrawlConfig config
which isnull
. - 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, theCrawlConfig config
in yourCrawlerService
is declaredfinal
, andmockito
will ignore this field, as for this type of injectionmockito
ignoresfinal
orstatic
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.
add a comment |
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
andCrawlerService crawlerService
. ButcrawlerService
you don't just declare but initialize as well. - When you initialize it, you are passing as a dependency to it
CrawlConfig config
which isnull
. - 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, theCrawlConfig config
in yourCrawlerService
is declaredfinal
, andmockito
will ignore this field, as for this type of injectionmockito
ignoresfinal
orstatic
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.
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
andCrawlerService crawlerService
. ButcrawlerService
you don't just declare but initialize as well. - When you initialize it, you are passing as a dependency to it
CrawlConfig config
which isnull
. - 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, theCrawlConfig config
in yourCrawlerService
is declaredfinal
, andmockito
will ignore this field, as for this type of injectionmockito
ignoresfinal
orstatic
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.
answered Nov 12 at 10:08
Sergii Bishyr
4,55731835
4,55731835
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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