使用 HandlerInterceptorAdapter 时如何测试 Spring REST 网络服务?
How to test Spring REST webservice when using a HandlerInterceptorAdapter?
我正在开发 Spring 网络服务。我想测试我的端点,但出于某种原因,当我 运行 测试时,我总是得到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.....IncomingInterceptor'
但是,我用 @Component
注释了 class。当我使用外部客户端测试端点时,拦截器起作用了!有人知道如何解决这个问题吗?
这是我测试端点时的代码:
私人 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;
}
}
注意:我不想测试拦截器是否有效,我想测试端点!!!
提前致谢!
尽管您的测试代码片段没有显示使用的是什么测试运行程序 (@RunWith(...)
),但我猜您使用的是 SpringRunner
或 SpringJUnit4ClassRunner
测试跑者.
您的代码片段模拟了 IncomingInterceptor
的一个实例,但是它没有作为 bean 添加到 (test)ApplicationContext
。使用 @MockBean
而不是 @Mock
将模拟 bean 添加到 ApplicationContext
.
@MockBean
private IncomingInterceptor incomingInterceptor;
我正在开发 Spring 网络服务。我想测试我的端点,但出于某种原因,当我 运行 测试时,我总是得到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.....IncomingInterceptor'
但是,我用 @Component
注释了 class。当我使用外部客户端测试端点时,拦截器起作用了!有人知道如何解决这个问题吗?
这是我测试端点时的代码: 私人 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;
}
}
注意:我不想测试拦截器是否有效,我想测试端点!!! 提前致谢!
尽管您的测试代码片段没有显示使用的是什么测试运行程序 (@RunWith(...)
),但我猜您使用的是 SpringRunner
或 SpringJUnit4ClassRunner
测试跑者.
您的代码片段模拟了 IncomingInterceptor
的一个实例,但是它没有作为 bean 添加到 (test)ApplicationContext
。使用 @MockBean
而不是 @Mock
将模拟 bean 添加到 ApplicationContext
.
@MockBean
private IncomingInterceptor incomingInterceptor;