Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Controller的WebMvcTest带有@RequestParam,状态不是200,而是400_Java_Spring_Exception_Spring Mvc Test - Fatal编程技术网

Java @Controller的WebMvcTest带有@RequestParam,状态不是200,而是400

Java @Controller的WebMvcTest带有@RequestParam,状态不是200,而是400,java,spring,exception,spring-mvc-test,Java,Spring,Exception,Spring Mvc Test,我试着写@WebMvcTest: @ExtendWith(SpringExtension.class) @WebMvcTest(AudienceController.class) class LectureControllerTest { @Autowired private MockMvc mockMvc; @MockBean private LectureService lectureService; @MockBean private G

我试着写@WebMvcTest:

@ExtendWith(SpringExtension.class)
@WebMvcTest(AudienceController.class)
class LectureControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private LectureService lectureService;
    @MockBean
    private GroupService groupService;
    @MockBean
    private TeacherService teacherService;
    @MockBean
    private StudentService studentService;

    @BeforeEach
    public void init() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new LectureController(lectureService, groupService, teacherService, studentService)).build();
    }
@Test
    void whenGetRequest_thenReturnTTForTeacherPage() throws Exception {
        Teacher teacher = new Teacher(1, "teacher", "first");
        Subject subject = new Subject(1, "first");
        LocalDateTime date = LocalDateTime.now();
        Audience audience = new Audience(1, 100);
        Group group = new Group(1, "group");
        Lecture lecture = new Lecture(1, teacher, subject, Arrays.asList(group), date);
        lecture.setAudience(audience);

        when(teacherService.findOne(1)).thenReturn(teacher);
        when(lectureService.findLecturesByTeacher(teacher, date, date)).thenReturn(Arrays.asList(lecture));

        mockMvc.perform(get("/lecture/TTForTeacher/{id}", 1)
                .param("startDay", date.toString())
                .param("endDay", date.toString()))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(view().name("lecture/TTForTeacher"))
        .andExpect(forwardedUrl("lecture/TTForTeacher"))
        .andExpect(model().attribute("lectures", hasSize(1)))
        .andExpect(model().attribute("lectures", hasItem(
                allOf(
                        hasProperty("id", is(1)),
                        hasProperty("teacher", is(teacher)),
                        hasProperty("subject", is(subject)),
                        hasProperty("date", is(date)),
                        hasProperty("audience", is(audience)),
                        hasProperty("groups", is(Arrays.asList(group)))
                )
        )));

        verify(lectureService, times(1)).findLecturesByTeacher(teacher, date, date);
    }
对于我的控制器:

@Controller
@RequestMapping("/lecture")
public class LectureController {

    private LectureService lectureService;
    private GroupService groupService;
    private TeacherService teacherService;
    private StudentService studentService;

    public LectureController(LectureService lectureService, GroupService groupService, TeacherService teacherService,
            StudentService studentService) {
        this.lectureService = lectureService;
        this.groupService = groupService;
        this.teacherService = teacherService;
        this.studentService = studentService;
    }
@GetMapping("/TTForTeacher/{id}")
    public String getTTForTeacher(@PathVariable("id") int id, @RequestParam(value = "startDay") LocalDateTime startDay,
            @RequestParam(value = "endDay") LocalDateTime endDay, Model model) {
        model.addAttribute("lectures",
                lectureService.findLecturesByTeacher(teacherService.findOne(id), startDay, endDay));
        return "lecture/TTForTeacher";
    }
但它有故障:状态预期:但为: 在控制台中:

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /lecture/TTForTeacher/1
       Parameters = {startDay=[10.05.2020, 10:00], endDay=[31.05.2020, 20:00]}
          Headers = []
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = com.foxminded.university.controller.LectureController
           Method = com.foxminded.university.controller.LectureController#getTTForTeacher(int, LocalDateTime, LocalDateTime, Model)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.method.annotation.MethodArgumentTypeMismatchException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

我试着不使用.paramday,date.toString,将多种格式的字符串设置为这个参数,使用not.param,但是我有一个例外,你能帮我吗。其他方法的所有其他测试都是成功的,但这些方法中没有@RequestParam。那么,我如何测试这样的方法呢?

控制器缺少解析数据的逻辑。默认情况下,Spring不知道如何将字符串转换为datetime对象。有两种方法可以解决这个问题,一种方法是将日期作为字符串而不是LocalDate读取,然后解析字符串以获取startDay和endDay,但是有一种更好的方法使用@DateTimeFormat

控制器方法变成这样

public String getTTForTeacher(@PathVariable("id") int id, @RequestParam(value = "startDay") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDay,
                                  @RequestParam(value = "endDay") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDay) {

Test mockMvc可以保持原样,因为您正在执行LocalDateTime。现在。toString

谢谢!它起作用了!但这很奇怪,因为当我在服务器上运行我的应用程序,试图为老师获取TT,并检查这个控制器是否工作时,一切都很好,一切都正常。为什么会发生这种情况?但实际上,谢谢你对这个问题的帮助