为什么 spring 测试失败,不起作用@MockBean
Why spring test is fail, does not work @MockBean
我尝试为一个简单的 spring-boot 控制器创建我的第一个测试,但我得到了 Handler: Type = null
。在浏览器中,代码可以工作,但测试失败。我的应用程序使用 spring-security。请帮我解决一个问题并理解我的错误。谢谢。
这是控制器:
private final ItemService service;
@GetMapping("/get_all_items")
public String getAllItems(Model model) {
model.addAttribute("items", service.getAll());
return "all_items";
}
这是一个测试。
@RunWith(SpringRunner.class)
@WebMvcTest(ItemController.class)
public class ItemControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private ItemService itemService;
@Test
@WithMockUser(username = "user", roles = "user")//mock security.
public void whenGetAllItemsThenControllerReturnAllItems() throws Exception {
given(
itemService.getAll()
).willReturn(
new ArrayList<Item>()
);
mvc.perform(
get("/get_all_items").accept(MediaType.TEXT_HTML)
).andExpect(
status().isOk()
);
}
}
这是结果日志:
MockHttpServletRequest:
HTTP Method = GET
Request URI = /get_all_items
Parameters = {}
Headers = {Accept=[text/html]}
Handler:
Type = null
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 403
Error message = Access is denied
Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store,
max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0],
X-Frame-Options=[DENY], Strict-Transport-Security=[max-age=31536000 ;
includeSubDomains]}
Content type = null
Body =
Forwarded URL = null Redirected URL = null
Cookies = []
java.lang.AssertionError: Status Expected :200 Actual :403
这基本上是一个重复的问题,已在此处回答:
解决方案是 导入 @Configuration
class 用于 Spring 安全配置,除了声明 @WebMvcTest(ItemController.class)
之类的此 @Import(SecurityConfig.class)
(假设您的 Spring 安全自定义配置位于名为 SecurityConfig
的 class 中。
您可能还会发现 Spring Boot 问题跟踪器中的讨论也很有帮助:https://github.com/spring-projects/spring-boot/issues/6514
另一种选择是 禁用 Spring 安全性,如下所述:
我尝试为一个简单的 spring-boot 控制器创建我的第一个测试,但我得到了 Handler: Type = null
。在浏览器中,代码可以工作,但测试失败。我的应用程序使用 spring-security。请帮我解决一个问题并理解我的错误。谢谢。
这是控制器:
private final ItemService service;
@GetMapping("/get_all_items")
public String getAllItems(Model model) {
model.addAttribute("items", service.getAll());
return "all_items";
}
这是一个测试。
@RunWith(SpringRunner.class)
@WebMvcTest(ItemController.class)
public class ItemControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private ItemService itemService;
@Test
@WithMockUser(username = "user", roles = "user")//mock security.
public void whenGetAllItemsThenControllerReturnAllItems() throws Exception {
given(
itemService.getAll()
).willReturn(
new ArrayList<Item>()
);
mvc.perform(
get("/get_all_items").accept(MediaType.TEXT_HTML)
).andExpect(
status().isOk()
);
}
}
这是结果日志:
MockHttpServletRequest: HTTP Method = GET Request URI = /get_all_items Parameters = {} Headers = {Accept=[text/html]}
Handler: Type = null
Async: Async started = false Async result = null
Resolved Exception: Type = null
ModelAndView: View name = null View = null Model = null
FlashMap: Attributes = null
MockHttpServletResponse: Status = 403 Error message = Access is denied Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY], Strict-Transport-Security=[max-age=31536000 ; includeSubDomains]} Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = []
java.lang.AssertionError: Status Expected :200 Actual :403
这基本上是一个重复的问题,已在此处回答:
解决方案是 导入 @Configuration
class 用于 Spring 安全配置,除了声明 @WebMvcTest(ItemController.class)
之类的此 @Import(SecurityConfig.class)
(假设您的 Spring 安全自定义配置位于名为 SecurityConfig
的 class 中。
您可能还会发现 Spring Boot 问题跟踪器中的讨论也很有帮助:https://github.com/spring-projects/spring-boot/issues/6514
另一种选择是 禁用 Spring 安全性,如下所述: