我在测试Rest请求时遇到问题。 但是我的拦截器之一正在拦截测试。
简而言之,我想模拟拦截器的行为,而不是调用实际的实现。
为简单起见,在此处可视化问题是一个简单的Get请求
@Controller
public class HiController {
@ResponseBody
@GetMapping(value = "/hi", produces = {"application/json"})
public String hi() {
return "hi";
}
}
带有简单的拦截器和配置文件
@Component
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public final boolean preHandle(HttpServletRequest request, final HttpServletResponse response, final Object handler) {
System.out.println("Logging token interceptor");
return true;
}
}
@Component
public class InterceptorAppConfig implements WebMvcConfigurer {
@Autowired
private LoggingInterceptor loggingTokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingTokenInterceptor);
}
}
测试的目的是调用剩余端点并模拟拦截器
@RunWith(SpringRunner.class)
@WebMvcTest(HiController.class)
public class HiControllerTest extends MvcTest {
@Autowired
private MockMvc mockMvc;
@MockBean
RestTemplate restTemplate;
@Mock
private HiController controller;
private static final String AUTHENTICATE_USER = "/hi";
@Test
public void mandatoryFieldMissing() throws Exception {
this.mockMvc.perform(get(AUTHENTICATE_USER))
.andExpect(content().string(containsString("hi")))
.andExpect(status().isOk());
}
}
@RunWith(SpringRunner.class)
public abstract class MvcTest {
@MockBean
LoggingInterceptor loggingTokenInterceptor;
}
运行此测试时,仍会调用^ LoggingInterceptor
。
如何配置测试以包含模拟拦截器?
答案 0 :(得分:0)
您正在使用@MockBean
。在文档中,
如果上下文中存在与声明的类兼容的bean,则将其替换为模拟。如果不是这种情况,它将在上下文中将模拟作为Bean添加。
模拟的bean没有行为。通过模拟bean来认识到,您有责任定义行为。
您可以禁用对bean的模拟(以允许默认行为)
Mockito.doCallRealMethod().when(loggingTokenInterceptor).preHandle(Mockito.any(), Mockito.any(), Mockito.any());
或者您可以自己定义模拟bean的行为。