Java @Controller的WebMvcTest带有@RequestParam,状态不是200,而是400
我试着写@WebMvcTest: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
@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,并检查这个控制器是否工作时,一切都很好,一切都正常。为什么会发生这种情况?但实际上,谢谢你对这个问题的帮助