使用HandlerInterceptorAdapter时如何测试Spring REST Web服务?

时间:2019-05-29 19:06:20

标签: spring testing interceptor

我正在开发Spring Web服务。我想测试端点,但是由于某些原因,在运行测试时,总是会遇到以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.....IncomingInterceptor' 

但是,我用@Component注释了班级。当我使用外部客户端测试端点时,拦截器将起作用!有人知道如何解决这个问题吗?

这是我测试端点时的代码:     私人MockMvc mockMvc;

@InjectMocks
private AccountController accountController;

@Mock
private IncomingInterceptor incomingInterceptor;

private Gson gson;

@Before
public void setup() {
    gson = new Gson();
    mockMvc = MockMvcBuilders.standaloneSetup(accountController).addInterceptors(incomingInterceptor).build();
}

@Test
public void testAddAccount() throws 
    mockMvc.perform(MockMvcRequestBuilders.post("/account/add")
            .content(gson.toJson(account))
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.id").isNotEmpty());
}

传入拦截器的代码:

@Component
public class IncomingInterceptor extends HandlerInterceptorAdapter {

@Autowired
private Gson gson;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//code in here works
    return true;
}
}

注意:我不想测试拦截器是否正常工作,我想测试端点!!! 预先感谢!

1 个答案:

答案 0 :(得分:0)

尽管您的测试代码段没有显示使用的是什么测试运行程序(@RunWith(...)),但我猜测是您正在使用SpringRunnerSpringJUnit4ClassRunner测试运行程序。

您的代码段模拟了IncomingInterceptor的实例,但是它没有作为bean添加到(test)ApplicationContext中。使用@MockBean而非@Mock将模拟的bean添加到ApplicationContext

@MockBean
private IncomingInterceptor incomingInterceptor;