I am testing ControllerAdvice class where i have EncodeUtil is autowired, this is always resolved as Null when I run using JUnit test, no issue when run via spring boot application, what am i missing here?
@ControllerAdvice
public class Base64EncodedResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Autowired
private EncodeUtil encodeUtil;
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body,
MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> converterType,
ServerHttpRequest request,
ServerHttpResponse response) {
if(returnType.getMethod().getName().equalsIgnoreCase("doPNMImage"))
{
encodeUtil.encodeBase64(body);
response.getHeaders().add("ENCODE_TYPE", "Base64");
}
else return body;
}
}
Here is my Junit Class, i have
@ExtendWith(SpringExtension.class)
@WebMvcTest(PNMImageController.class)
@AutoConfigureMockMvc
public class Base64EncodedResponseBodyAdviceTest {
@Mock
private EncodeUtil encodeUtil;
@InjectMocks
PNMImageController pnmImageController;
@BeforeEach
void init(){
MockitoAnnotations.initMocks(pnmImageController);
mockMvc = MockMvcBuilders.standaloneSetup(pnmImageController)
.setControllerAdvice(Base64EncodedResponseBodyAdvice.class)
.build();
}
@Test
public void getAuthorizeTest() throws Exception {
ReflectionTestUtils.setField(encodeUtil, "salt", SALT);
Mockito.when(this.encodeUtil.encodeBase64()).thenReturn(TEST_BASE64_STR);
mockMvc.perform(post("http://localhost:8080/image/doPNMImage"))
.andExpect(status().isOk())
.andExpect(content().string(TEST_BASE64_STR))
.andExpect(header().string("ENCODE_TYPE", "Base64"));
}
}
The test fails with Nullpointer exception
Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "com.ylm.cnpl.core.util.EncodeUtil.encodeBase64(String)" because "this.encodeUtil" is null
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "com.ylm.cnpl.core.util.encodeBase64(String)" because "this.encodeUtil" is null
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)