@WebMvcTest - Как настроить безопасность для запуска теста? - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь выполнить модульное тестирование моей службы 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. Я предполагаю, что он аутентифицируется очень хорошо.Но почему моя модель и вид будут нулевыми?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...