0

需要跳过控制器中令牌 ID 登录的验证以进行单元测试

由于我正在测试控制器本身,因此不确定要使用什么 Mock 或 spy

public class TestController extends BaseController {

    @Autowired
    TestService service;    

    @RequestMapping(value = "/test")
    public @ResponseBody TestResponse getAll(@RequestBody TestRequest request) {

        validateToken(request);
        TestResponse response = service.getall(request);
        response.setTokenID(request.getTokenID());
        return response;
    }   

}

public class BaseController {

    protected void validateToken(IRequest request) {

        TokenResponse tokenresponse = restTemplate.exchange(TokenServiceURL, HttpMethod.GET, null, TokenResponse .class, tokenId).getBody();
        User user = new user()
        user.setUserRole(tokenresponse.getUser()));
        request.setUser(user);
    }
}

public class TestControllerTest {

    private MockMvc mockMvc;

    @Autowired
        private WebApplicationContext wac;

    @Autowired
    private TestController testControlller;

    @MockBean
        private TestService testService;

    BaseController baseControllerSpy = Mockito.spy(BaseController.class);


    @Before
    public void setUp(){
         MockitoAnnotations.initMocks(this);        
             mockMvc =  MockMvcBuilders.webAppContextSetup(wac).build();
    }


    @Test
    public void verifygetAll() throws Exception {
        TestRequest request = new TestRequest();        
        TestResponse response = new Response();     

        **Mockito.doNothing().when(baseControllerSpy).validateTokenID(request);**
        when(testService.get(request)).thenReturn(response);

        mockMvc.perform(MockMvcRequestBuilders.post("/test")
        .contentType(MediaType.APPLICATION_JSON)
        .content(requestString)
        .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
    }

}

作为间谍的基本控制器似乎不起作用,有没有其他方法可以解决这个问题。请帮忙

4

1 回答 1

0

我可以建议你两个解决方案:

  1. 我假设如果您在同一个包中,那么您必须在执行 build() 时在 mockMvc 中注入 TestController 的间谍,然后您可以创建 validateToken mockMvc
doNothing().when((BaseController)testController).validateTokenID(any());
  1. 如果之前的解决方案不兼容,那么您可以使用 TestControllerForTest 扩展 TestController 类,并且您可以在什么都不做的情况下覆盖 validateTokenID 方法。
于 2019-08-21T21:56:24.097 回答