Tag: mockmvc

使用MockMvc在Spring MVC中进行unit testing/登录

我有一个使用Spring MVC创建的非常简单的REST应用程序。 (代码可以在GitHub上获得 。)它有一个简单的WebSecurityConfigurer ,如下所示: @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf().disable() .exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint) .and() .authorizeRequests() .antMatchers(“/user/new”).permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage(“/login”).permitAll() .successHandler(authenticationSuccessHandler) .failureHandler(authenticationFailureHandler) .and() .logout() .permitAll() .logoutSuccessHandler(logoutSuccessHandler); } 当我运行应用程序时,自定义控制器和登录/注销页面都可以正常工作。 我甚至可以通过MockMvc unit testing /user/new MockMvc 。 但是,当我尝试使用以下function测试/login时 @Test public void testUserLogin() throws Exception { RequestBuilder requestBuilder = post(“/login”) .param(“username”, testUser.getUsername()) .param(“password”, testUser.getPassword()); mockMvc.perform(requestBuilder) […]

使用Spring mvc和MockMVC上传文件

我已成功将图像文件上传到WebContent\resources\uploads\image.jsp 。 但我在使用MockMvc测试时遇到了问题。 当我运行测试用例时,我发现未找到exception文件并拒绝访问 。 控制器看起来像这样: @RequestMapping(value=”/AddContacts”, method=RequestMethod.POST) public @ResponseBody String addContacts(ContactBean cb,HttpServletRequest request,HttpServletResponse response,@RequestParam(“upload”) MultipartFile file) throws IllegalStateException, IOException { String error=cb.validate(); if(error.equals(“”)){ Model m=new Model(); String ret=m.addData(cb); System.out.println(“Contact Bean: “+cb); if(ret.equals(“DBFAIL”)){ response.setStatus(500); } else if(ret.equals(“EXIST”)){ response.setStatus(409); } else{ response.setStatus(200); /* to upload a file */ if(file != null && file.getSize() > 0){ System.out.println(“File […]

使用MockMvc的Hamcrest:检查该键是否存在但值可能为null

我正在使用MockMvc进行一些测试,我想validationJSON响应的结构。 具体来说,我想确保属性的键存在,并且该值是某个类型或null。 { “keyToNull”: null, # This may be null, or a String “keyToString”: “some value” } 以下对我有用,但我想知道是否有办法将每组两个期望合并为一行,因为我有很多要检查的属性: import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.hamcrest.Matchers.*; .andExpect(jsonPath(“$”).value(hasKey(“keyToNull”))) .andExpect(jsonPath(“$.keyToNull”).value( anyOf(any(String.class), nullValue(String.class)))) .andExpect(jsonPath(“$”).value(hasKey(“keyToString”))) .andExpect(jsonPath(“$.keyToString”).value( anyOf(any(String.class), nullValue(String.class)))) hasKey()是必需的,因为另一个断言本身通过,因为MockMvc的实现映射中不存在的键映射为null: .andExpect(jsonPath(“$.notAKey”).value( anyOf(any(String.class), nullValue(String.class)))) // ok jsonPath().exists()也不起作用,因为在内部它将值与null进行比较。 我考虑过这样一个单独的方法: private static void assertNullableAttr(ResultActions res, String jsonPath, Class type) throws Exception { int split = […]

在需要身份validation的控制器上运行unit testing

我有一个spring boot应用程序,需要登录才能执行某些操作。 我试图使用MockMvc测试它们,但它似乎不起作用。 我一直收到状态为403的HTTP响应(禁止)。 可能是身份validation部分出了问题。 我已经尝试过遵循文档 ,但我无法使其正常工作。 这是我目前的测试代码: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = {Application.class}) @WebIntegrationTest(“server.port = 8093”) public class PasswordChangeTests { @Autowired private EmbeddedWebApplicationContext webApplicationContext; @Autowired private UserRepository userRepository; private MockMvc mockMvc; @Before public void setUp() throws Exception { this.mockMvc = MockMvcBuilders .webAppContextSetup(webApplicationContext) .apply(springSecurity()) .build(); } @Test public void changePasswordWorks() throws Exception { // Send password change […]

为什么Spring MockMvc结果不包含cookie?

我试图在我的REST API中对登录和安全性进行unit testing,因此我尝试尽可能接近地模拟现实生活中的请求序列。 我的第一个请求是: this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac). addFilters(springSecurityFilterChain).build(); this.mapper = new ObjectMapper(); …. MvcResult result=mockMvc.perform(get(“/login/csrf”)).andExpect(status().is(200)).andReturn(); Cookie[] cookies = result.getResponse().getCookies(); (参见关于pastebin的完整课程)。 我尝试在这里获取cookie以便能够稍后使用收到的CSRF令牌登录,但cookies数组是空的! 但是,如果我运行我的应用程序并打电话 curl -i http://localhost:8080/login/csrf 我确实得到了一个Set-Cookie标头,可以稍后使用该cookie(以及CSRF令牌)进行身份validation。 所以问题是:我如何让MockMvc向我返回一个cookie?

使用MockMVC在JUnitTest中注册@ControllerAdvice注释控制器

我的@ControllerAdvice注释控制器如下所示: @ControllerAdvice public class GlobalControllerExceptionHandler { @ResponseStatus(value = HttpStatus.UNAUTHORIZED) @ExceptionHandler(AuthenticationException.class) public void authenticationExceptionHandler() { } } 当然我的开发是测试驱动的,我想在JUnit测试中使用我的exceptionHandler。 我的测试用例如下: public class ClientQueriesControllerTest { private MockMvc mockMvc; @InjectMocks private ClientQueriesController controller; @Mock private AuthenticationService authenticationService; @Before public void setup() { MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); } @Test public void findAllAccountRelatedClientsUnauthorized() throws Exception { when(authenticationService.validateAuthorization(anyString())).thenThrow(AuthenticationException.class); mockMvc.perform(get(“/rest/clients”).header(“Authorization”, UUID.randomUUID().toString())) .andExpect(status().isUnauthorized()); } […]

java.lang.NoSuchMethodError:使用Mockito和Junit时的javax.servlet.http.HttpServletRequest.isAsyncStarted()

我试图用TDD弄湿我的脚。 我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写unit testing用例。 但是我收到运行时错误,从而导致测试失败。 起初,由于找不到javax.servlet.SessionCookieConfig ,我在设置中初始化MockMvc实例时遇到了问题。 我通过下载javax.servlet api并将其配置到项目的构建路径来解决,但后来我面临着 java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() 在MockMvc实例上使用perform() 。 任何人都可以告诉我如何处理这种依赖,因为我认为它是由于不兼容的服务器servlet-api和javax.servlet api而发生的。 编辑:我发布我用于unit testing的代码,但我不认为这将是任何帮助,但以防万一: @RunWith(MockitoJUnitRunner.class) public class MyControllerTest { @InjectMocks private MyController myController = new MyController(); @Mock private MyService myService = new MyServiceImpl(); private MockMvc mockMvc; @Before public void setUp(){ this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build(); } @Test public void testList() throws Exception{ A a = […]