1

我在测试休息请求时遇到问题。然而,我的一个拦截器正在拦截测试。

简而言之,我想模拟拦截器的行为而不是调用实际的实现。

为简单起见,这里的问题是一个简单的 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仍然被调用。

如何将测试配置为具有模拟拦截器?

4

1 回答 1

0

您正在使用@MockBean. 从文档中,

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

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

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

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

于 2020-04-20T21:57:17.430 回答