2017-06-05 43 views
0

我正在使用spring引导开发一个应用程序。我想单元测试我的Rest服务登录(),我的服务运行良好(我使用邮差)。请看看我为联合测试所做的尝试。 例如当我输入正确的用户名和密码,我得到了一个标记为一返回值:如何使用spring引导为REST登录Web服务编写单元测试

enter image description here

,当我输入一个错误的用户名和密码,我得到这个:

enter image description here

这些是我的应用程序的体系结构:

app 
| 
src/main/java 
|--DemoApplication.java 
|--dao.package 
     |--UserRepository.java 
|--jwt.package 
     |--UserController.java 
src/test/java 
|--jwt.package.test 
     |--UserControllerTest.java 

DemoApplication.java

@SpringBootApplication 
public class DemoApplication implements CommandLineRunner { 


    public static void main(String[] args) { 

     SpringApplication.run(DemoApplication.class, args); 
    } 

    @Override 
    public void run(String... args) throws Exception { 

    } 
} 

UserController.java

@RestController 
@RequestMapping("/user") 
public class UserController { 

    @Autowired 
    private UserRepository userRepository; 

    @PostMapping("login") 
    public LoginResponse login(@RequestBody final UserLogin login) 
     throws ServletException, 
      UnsupportedEncodingException { 

     User user = userRepository.findByUsernameAndPassword(login.username, 
      login.password); 

     if (user == null) 
      throw new ServletException("Invalid login"); 

     StringBuilder roles = new StringBuilder(); 
     user.getRoles() 
      .forEach(role -> roles.append(role.getName()).append(",")); 
     return new LoginResponse(Jwts.builder().setSubject(login.username) 
      .claim("roles", roles).setIssuedAt(new Date()) 
      .signWith(SignatureAlgorithm.HS256, "accenture".getBytes("UTF-8")) 
      .compact()); 
    } 

    private static class UserLogin { 

     public String username; 

     public String password; 
    } 

    private static class LoginResponse { 

     public String token; 

     public LoginResponse(final String token) { 
      this.token = token; 
     } 
    } 
} 

我想测试我的登录Web服务,但仍然不正确。任何人都可以帮我请进行单元测试我的登录服务

UserControllerTest.java:所有的

@RunWith(SpringRunner.class) 
@WebMvcTest(value = UserController.class, secure = false) 
public class UserControllerTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @MockBean 
    private UserRepository userRepository; 

    User mockUser = new User("test", "test"); 

    String exampleUserJson = "{\"username\":\"toto\",\"password\":\"toto\"}"; 


    @Test 
    public void loginTest() throws Exception { 


     User mockUser = new User("test", "test"); 

    Mockito.when(
      userRepository.findByUsernameAndPassword(Mockito.anyString(), 
       Mockito.anyString())).thenReturn(mockUser); 

    // Send course as body to /students/Student1/courses 
    RequestBuilder requestBuilder = MockMvcRequestBuilders 
      .post("/user/login") 
      .accept(MediaType.APPLICATION_JSON).content(exampleUserJson) 
      .contentType(MediaType.APPLICATION_JSON); 

    MvcResult result = mockMvc.perform(requestBuilder).andReturn(); 

    MockHttpServletResponse response = result.getResponse(); 

    assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), response.getStatus()); 

    assertEquals("http://localhost/user/login", 
      response.getHeader(HttpHeaders.LOCATION)); 

    } 

回答

0

先了解春季安全性是如何工作的。

如果你没有提供任何配置,它会要求为每一件事认证。

,如果你想测试认证那么你需要做的仅仅是调用中包含的用户名和密码的安全API,

curl -v http://localhost:9090/mynet/ -u admin:admin12344 -c D:\cookies.txt -H "Accept: application/json" 

成功塞纳里奥:在上面的例子中,我叫做安全端点得到一个cookie响应与HTTP/1.1 200,如果认证成功,是您可以使用下面进一步的呼叫,

curl -v http://localhost:9090/mynet/customers -b D:\cookies.txt 

失败场景:我们得到HTTP/1.1 401 JSON

{"timestamp":1496645081468,"status":401,"error":"Unauthorized","message":"No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken","path":"/mynet/"} 

注:我知道你需要使用Java代码,而不是卷曲检查上面的调用。我用这只是为了解释概念。

相关问题