春季靴-模拟拦截器

时间:2019-09-25 19:10:47

标签: java spring-boot spring-boot-test springmockito

我在测试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

如何配置测试以包含模拟拦截器?

1 个答案:

答案 0 :(得分:0)

您正在使用@MockBean。在文档中,

如果上下文中存在与声明的类兼容的bean,则将其替换为模拟。如果不是这种情况,它将在上下文中将模拟作为Bean添加。

模拟的bean没有行为。通过模拟bean来认识到,您有责任定义行为。

您可以禁用对bean的模拟(以允许默认行为) Mockito.doCallRealMethod().when(loggingTokenInterceptor).preHandle(Mockito.any(), Mockito.any(), Mockito.any());

或者您可以自己定义模拟bean的行为。