2015-04-06 86 views
2

已搜索,但不幸我没有得到类似的问题。我粘贴了我涉及的代码。它使用Spring DATA框架。如何在Junit测试中从responseentity中提取路径变量

  1. 实体EscalationPolicy自动生成
  2. 控制器手POST请求创建一个新的策略ID
  3. 更新JUnit测试

我试图在测试中做的是第一使用由initTest()设置的对象创建一个新的EscalationPolicy。然后获取并更新它。然而,ID是未知的,我想我需要从返回URI中提取它。在Mockmvc执行并感谢任何帮助后,我不知道该怎么做。谢谢!

@Entity 
    @Table(name = "T_ESCALATIONPOLICY") 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    public class EscalationPolicy implements Serializable { 
     @Id 
     @GeneratedValue(generator = "uuid") 
     @GenericGenerator(name = "uuid", strategy = "uuid") 
     private String id; 

     @Column(name = "policy_name") 
     private String policy_name; 
     ... 
    } 

    @RestController 
    @RequestMapping("/api") 
    public class EscalationPolicyResource { 
    ... 
     /** 
     * POST /escalationPolicys -> Create a new escalationPolicy. 
     */ 
     @RequestMapping(value = "/escalationPolicys", 
       method = RequestMethod.POST, 
       produces = MediaType.APPLICATION_JSON_VALUE) 
     @Timed 
     public ResponseEntity<Void> create(@RequestBody EscalationPolicy escalationPolicy) throws URISyntaxException { 
      log.debug("REST request to save EscalationPolicy : {}", escalationPolicy); 
      if (escalationPolicy.getId() != null) { 
       return ResponseEntity.badRequest().header("Failure", "A new escalationPolicy cannot already have an ID").build(); 
      }  

      escalationPolicyRepository.saveAndFlush(escalationPolicy); 
      return ResponseEntity.created(new URI("/api/escalationPolicys/" + escalationPolicy.getId())).build(); 
     } 
    ... 
    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    @SpringApplicationConfiguration(classes = Application.class) 
    @WebAppConfiguration 
    @IntegrationTest 
    public class EscalationPolicyResourceTest { 
     @Before 
     public void initTest() {   
      escalationPolicy = new EscalationPolicy(); 
      escalationPolicy.setPolicy_name("Policy Test"); 
      ... 
     } 

     @Test 
     @Transactional 
     public void updatePolicy() throws Exception { 
      // Create the EscalationPolicy 
      restEscalationPolicyMockMvc.perform(post("/api/escalationPolicys") 
        .contentType(TestUtil.APPLICATION_JSON_UTF8) 
        .content(TestUtil.convertObjectToJsonBytes(escalationPolicy))) 
        .andExpect(status().isCreated()); 


      // Get the created policy 
      EscalationPolicy e = escalationPolicyRepository.findOne(id); 
                    ~~need ID here 
     } 
     ... 
    } 

回答

0

虽然它可能不是最优雅的方式来处理它,我想一​​种方法来绕过这个问题。我将标识保存在标题地图和测试代码中以提取它。

@RestController 
    @RequestMapping("/api") 
    public class EscalationPolicyResource { 
    ... 
     /** 
     * POST /escalationPolicys -> Create a new escalationPolicy. 
     */ 
     @RequestMapping(value = "/escalationPolicys", 
       method = RequestMethod.POST, 
       produces = MediaType.APPLICATION_JSON_VALUE) 
     @Timed 
     public ResponseEntity<Void> create(@RequestBody EscalationPolicy escalationPolicy) throws URISyntaxException { 
      log.debug("REST request to save EscalationPolicy : {}", escalationPolicy); 
      if (escalationPolicy.getId() != null) { 
       return ResponseEntity.badRequest().header("Failure", "A new escalationPolicy cannot already have an ID").build(); 
      }  

      escalationPolicyRepository.saveAndFlush(escalationPolicy); 

      HttpHeaders headers = new HttpHeaders(); 
      headers.set("policyID", escalationPolicy.getId()); 
      return new ResponseEntity<Void>(headers, HttpStatus.CREATED); 
     } 
    ... 
    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    @SpringApplicationConfiguration(classes = Application.class) 
    @WebAppConfiguration 
    @IntegrationTest 
    public class EscalationPolicyResourceTest { 
     @Before 
     public void initTest() {   
      escalationPolicy = new EscalationPolicy(); 
      escalationPolicy.setPolicy_name("Policy Test"); 
      ... 
     } 

     @Test 
     @Transactional 
     public void updatePolicy() throws Exception { 
      // Create the EscalationPolicy 
      ResultActions action = 
        restEscalationPolicyMockMvc.perform(post("/api/escalationPolicys") 
        .contentType(TestUtil.APPLICATION_JSON_UTF8) 
        .content(TestUtil.convertObjectToJsonBytes(escalationPolicy))); 

      action.andExpect(status().isCreated()); 

      id = (String)action.andReturn().getResponse().getHeaderValue("policyID"); 

      // Get the created policy 
      EscalationPolicy e = escalationPolicyRepository.findOne(id); 
     } 
     ... 
    }