2016-12-15 76 views
0

我试图单元测试控制器来保存一个Brand实体。在这个测试中,我创建了一个Brand,我希望能够找回,然后我将JSON发布到控制器。本来,我是靠着pass-by-reference所以我的控制方法,基本上是做:我实际上并没有使用返回Brand从服务单元测试POST @WebMvcTest - @MockBean服务返回null

@Override 
public ResponseEntity<MappingJacksonValue> save(@Valid @RequestBody Brand brand, BindingResult bindingResult) { 

    validate(brand, null, bindingResult); 
    if (bindingResult.hasErrors()) { 
     throw new InvalidRequestException("Invalid Brand", bindingResult); 
    } 

    this.brandService.save(brand); // pass by reference 
    MappingJacksonValue mappingJacksonValue = jsonView(JSON_VIEWS.SUMMARY.value, brand); 
    return new ResponseEntity<>(mappingJacksonValue, HttpStatus.CREATED); 
} 

注意。当我以这种方式进行测试时,我的测试失败了,因为控制器正在返回我传入的JSON,并且由于该服务被嘲笑,控制器没有返回我期望的品牌,即拥有ID。所以我改变了控制器要做到这一点:

brand = this.brandService.save(brand); 

然而,当我调试,从嘲笑服务返回的品牌为空。以下是我的测试。

@RunWith(SpringRunner.class) 
@WebMvcTest(BrandController.class) 
public class BrandSimpleControllerTest { 

    @Autowire 
    private MockMvc mockMvc; 

    @MockBean 
    private BrandService brandService; 

    @Test 
    public void testSave() throws Exception { 
    Brand brand = new Brand(); 
    brand.setId(1L); 
    brand.setName("Test Brand"); 

    when(this.brandService.save(brand)).thenReturn(brand); 

    this.mockMvc.perform(this.post("/api/brands") 
     .content("{\"name\": \"Test Brand\"}")) 
     .andExpect(jsonPath("$.id", is(1))) 
     .andExpect(jsonPath("$.name", is("Test Brand"))); 
    } 

} 

有什么建议?

回答

0

好的,问题解决了。问题在于你在服务调用中嘲笑的对象必须与传递给控制器​​的对象相同,所以当模拟着眼于预期的时候,它会说“哦,你给了我这个,所以你想要的”。以下是修改后的代码:

Brand brand = new Brand(); 
brand.setId(1L); 
brand.setName("Test Brand"); 
brand.setDateCreated(new LocalDateTime()); 
brand.setLastUpdated(new LocalDateTime()); 

// since all I'm passing into the controller is a brand name... 
when(this.brandService.save(new Brand("Test Brand"))).thenReturn(brand);