java - MockHttpServletResponse 主体为空

标签 java junit mocking mockito junit5

我尝试在我的 Controller 中测试我的方法 addPerson(),但是当我执行测试时,我在 MockHttpServletResponse 中有一个空主体的状态 200。我想用 MockMvcResultMatchers 中的 jsonPath 测试主体响应,但主体为空时无法执行此操作。

这是我的测试:

@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());
     }

这是我的 Controller ,方法是 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;
    }

感谢您的帮助。

最佳答案

当您模拟 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());
     }
}

关于java - MockHttpServletResponse 主体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60805398/

相关文章:

java - 使用 Java 和 Cloud SQL 的 AppEngine 托管虚拟机

java - 如何创建 spring 参数化事务测试

java - Mac 上的临时文件夹和文件#getCanonicalFile()

c# - 在单元测试 FormsAuthentication.SignOut() 中抛出错误

ios - 如何依赖 MFMailComposeViewController 及其类方法进行单元测试?

java - 在循环中启动和关闭线程好吗?

java - 方法引用可以用来访问静态方法吗?

c# - 不确定如何模拟 INancyModule.View 方法?

java - 我在网络应用程序中所做的事情是否可以轻易被黑客攻击或破坏?

spring - 为什么我收到 MockMvc 和 JUnit 的错误 403?