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")));
}
}
有什么建议?