Я пытаюсь выполнить модульное тестирование моей службы Spring Controller, которая возвращает строку.Я хочу подтвердить, что ожидаемое имя URL-адреса правильное, но мой тест всегда возвращает нулевой URL-адрес.Я использую SpringRunner, @WebMvcTest и MockMvc для этого.
@Slf4j
@Controller
public class CompanyInfoController {
private CompanyService companyService;
@Autowired
public CompanyInfoController(final CompanyService companyService) {
this.companyService = companyService;
}
@PreAuthorize("@someService.hasRole('" + Constants.MY_ROLE + "')")
@RequestMapping(value = "/companyInfo", method = RequestMethod.GET)
public String getCompanyInfo(final HttpServletRequest request, final
Model model) throws Exception {
log.debug("Getting Company Info");
final CompanyInfoDTO companyInformation = loadCompanyInfo(request);
model.addAttribute("companyInformation", companyInformation);
return "companyInfo";
}
private CompanyInfoDTO loadCompanyInfo(final HttpServletRequest request) throws Exception {
final Account someAccount= (Account)request.getAttribute("someAccount");
if (null != someAccount) {
final CompanyInfoDTO companyInformation = companyService.getCompanyInfo(someAccount);
return companyInformation;
} else {
throw new Exception("Unable to retrieve this account details.");
}
}
}
Тест контроллера -
@RunWith(SpringRunner.class)
@WebMvcTest(CompanyInfoController.class)
@Import(SecurityConfiguration.class)
public class CompanyInfoControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CompanyService companyService;
@MockBean(name = "someService")
private SomeService someAuthorizationService;
@Before
public void setUp(){
Mockito.when(someAuthorizationService.hasRole(Constants.MY_ROLE))
.thenReturn(true);
}
@Test
@WithMockUser
public void canInvokeGetCompanyInfoServiceSuccessfully() throws Exception{
CompanyInfoDTO dto = new CompanyInfoDTO();
final Account mockAccount = new Account();
mockAccount.setId("12334");
Mockito.when(companyService.getCompanyInfo(Mockito.any(Account.class)))
.thenReturn(dto);
RequestBuilder request = get("/companyInfo")
.requestAttr("someAccount", mockAccount);
mockMvc.perform(get("/companyInfo"))
.andExpect(status().isOk());
}
@Test
@WithMockUser
public void forwardsToCompanyInfoPageSuccessfully() throws Exception{
CompanyInfoDTO dto = new CompanyInfoDTO();
final Account mockAccount = new Account();
mockAccount.setId("12334");
Mockito.when(companyService.getCompanyInfo(Mockito.any(Account.class)))
.thenReturn(dto);
RequestBuilder request = get("/companyInfo")
.requestAttr("someAccount", mockAccount);
mockMvc.perform(request)
.andExpect(redirectedUrl("companyInfo"));
}
}
Тест не проходит с этой ошибкой - java.lang.AssertionError: Ожидается перенаправленный URL-адрес: companyInfo Актуально: null
Не уверен, что мне не хватает!Я не вижу распечатки инструкции отладки в моем контроллере.Но мой контроллер не отключен.Правильно ли издевается моя безопасность?Любая помощь очень ценится.
Обновление - это то, что я вижу в своих журналах -
MockHttpServletRequest:
HTTP Method = GET
Request URI = /companyInfo
Parameters = {}
Headers = []
Body = <no character encoding set>
Session Attrs = {}
Handler:
Type = org.cmt.controller.CompanyInfoController
Method = public java.lang.String org.cmt.controller.CompanyInfoController.getCompanyInfo(javax.servlet.http.HttpServletRequest,org.springframework.ui.Model) throws java.lang.Exception
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", X-Frame-Options:"SAMEORIGIN"]
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
java.lang.AssertionError: No ModelAndView found
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:36)
Я вижу Http-код ответа 200. Я предполагаю, что он аутентифицируется очень хорошо.Но почему моя модель и вид будут нулевыми?