【问题标题】:MockHttpServletResponse body emptyMockHttpServletResponse 主体为空
【发布时间】:2020-07-03 10:25:38
【问题描述】:

我尝试在我的控制器中测试我的方法addPerson(),但是当我执行测试时,我的状态为 200,MockHttpServletResponse 中的主体为空。我想用MockMvcResultMatchers 中的jsonPath 测试body 响应,但是当body 为空时我不能这样做。

这是我的测试:

@WebMvcTest(PersonController.class)
@ExtendWith(SpringExtension.class)
public class PersonControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private Model model;

    @MockBean
    private PersonService service;

     @Test
     public void addPersonTest() throws Exception {
        this.mvc.perform(post("/person/add")
            .contentType(MediaType.APPLICATION_JSON).content("{\"firstName\": \"Test\",\"lastName\": \"\",\"address\": \"\",\"city\": \"\",\"zip\": \"\",\"phone\": \"\",\"email\": \"\"}"))
            .andDo(MockMvcResultHandlers.print())
            .andExpect(status().isOk());
     }

这是我使用 addPerson() 方法的控制器

@RequestMapping("/person")
@RestController
public class PersonController {

    @Autowired
    Model model;

    private static final Logger logger = LogManager.getRootLogger();

    @Autowired
    private PersonService personService;

    @GetMapping("/")
    public List<Person> allPerson() {
        return personService.all();
    }

    @PostMapping("/add")
    public List<Person> addPerson(@RequestBody Person person) {
        List<Person> listPerson = this.personService.add(person);

        logger.info("Request = @RequestBody = {}", person);
        logger.info("Response {}", listPerson);
        return listPerson;
    }

这里是服务:

@Service
public class PersonService {

    @Autowired
    private Model model;

    public PersonService(Model model2) {
         this.model = model2;
    }

    public List<Person> add(Person person) {
        List<Person> listPersons = model.getPersons();
        listPersons.add(person);
        return listPersons;
    }

感谢您的帮助。

【问题讨论】:

  • 当您使用 @MockBean 注释模拟 PersonService 时,您会导致服务不调用实际方法并返回一个空列表。此外,您的 add 方法不会像您预期的那样工作,因为它不会将列表保存回您的模型。

标签: java junit mocking mockito junit5


【解决方案1】:

当你模拟 PersonService 时,你必须提供它的行为,否则它总是返回 null。您可以使用 Mockito 的 when().thenReturn() 来实现这一点:

@WebMvcTest(PersonController.class)
@ExtendWith(SpringExtension.class)
public class PersonControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private Model model;

    @MockBean
    private PersonService service;


     @Test
     public void addPersonTest() throws Exception {

           List<Person> personList = Arrays.asList(new Person()); // create list here
           when(service.add(any(Person.class)).thenReturn(personList); // mock the behaviour of your PersonService bean

           this.mvc.perform(post("/person/add")
            .contentType(MediaType.APPLICATION_JSON).content("{\"firstName\": \"Test\",\"lastName\": \"\",\"address\": \"\",\"city\": \"\",\"zip\": \"\",\"phone\": \"\",\"email\": \"\"}"))
            .andDo(MockMvcResultHandlers.print())
                    .andExpect(status().isOk());
     }
}

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2017-04-14
    • 2021-11-03
    • 2018-03-07
    • 2019-02-01
    • 2014-04-07
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多