Issue
Hi I am trying to test service layer. I have already wrote tests for ConverterFactory
. I think I need the mock dependency classes which ConverterServiceImpl
using but Still I got NullPointerException
@Service
@RequiredArgsConstructor
public class ConverterServiceImpl implements ConverterService {
ConverterFactory factory = new ConverterFactory();
private final WebLinkRepository webLinkRepository;
private final DeepLinkRepository deepLinkRepository;
@Override
public DeepLinkResponse toDeepLink(WebLinkRequest webLinkRequest) {
WebLink webLink;
String url = webLinkRequest.getUrl();
Converter converter = factory.getConverter(url);
webLink = new WebLink();
webLink.setUrl(url);
String convertedUrl = converter.toDeepLink(url);
webLink.setConvertedUrl(convertedUrl);
webLinkRepository.save(webLink);
return new DeepLinkResponse(convertedUrl);
}
}
And this is the test
@RunWith(MockitoJUnitRunner.class)
public class ConverterServiceImplTest {
@InjectMocks
ConverterServiceImpl converterService;
@Mock
WebLinkRepository webLinkRepository;
@Mock
DeepLinkRepository deepLinkRepository;
@Mock
ConverterFactory converterFactory;
@Mock
ProductConverter productConverter;
@Mock
WebLinkRequest webLinkRequest;
@BeforeAll
void init(){
webLinkRequest.setUrl(WEBLINK_ONLY_PRODUCT);
}
@Test
public void toDeepLink_only_content_id() {
ConverterFactory converterFactory = mock(ConverterFactory.class);
when(converterFactory.getConverter(any())).thenReturn(productConverter);
DeepLinkResponse deepLinkResponse = converterService.toDeepLink(webLinkRequest);
assertEquals(deepLinkResponse.getUrl(),"ty://?Page=Product&ContentId=1925865");
}
}
This code throws error says. What am i doing wrong here?:
java.lang.NullPointerException
at com.example.converter.service.factory.ConverterFactory.getConverter(ConverterFactory.java:13)
Solution
You don't need to create a ConverterFactory converterFactory = mock(ConverterFactory.class)
a second time in your test method, since you have already created such mock as a class field.
Besides, you did not inject the mock created in the test method into the class under test, whereas the mock, created as a field, was injected using @InjectMocks
annotation.
So just remove ConverterFactory converterFactory = mock(ConverterFactory.class)
from test method:
@RunWith(MockitoJUnitRunner.class)
public class ConverterServiceImplTest {
@InjectMocks
ConverterServiceImpl converterService;
@Mock
ConverterFactory converterFactory;
// other stuff
@Test
public void toDeepLink_only_content_id() {
when(converterFactory.getConverter(any())).thenReturn(productConverter);
// other stuff
converterService.toDeepLink(webLinkRequest);
}
}
Answered By - Georgii Lvov
Answer Checked By - David Marino (JavaFixing Volunteer)