在Java和Spring中对RESTAPI进行单元测试
我有一个简单的JavaSpringRESTAPI应用程序,我不知道如何对它进行单元测试。我读过JUnit和Mockito的纪录片,但我想不出来 下面是StudentController类中的post方法在Java和Spring中对RESTAPI进行单元测试,java,spring,rest,unit-testing,junit,Java,Spring,Rest,Unit Testing,Junit,我有一个简单的JavaSpringRESTAPI应用程序,我不知道如何对它进行单元测试。我读过JUnit和Mockito的纪录片,但我想不出来 下面是StudentController类中的post方法 @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public void insertStudent(@RequestBody Student student
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
这是StudentService类中的insertStudent方法
public void insertStudent(Student student) {
studentDao.insertStudent(student);
}
我使用MySQL作为数据库。我应该在单元测试中也使用数据库吗?我的意思是我不想要任何集成测试。我只需要单元测试。我在Node.js中使用supertest,它会处理所有问题,我也可以使用JUnit或Mockito吗?您想要模拟
studentService
并进行单元测试,以验证当调用API的insertStudent(Student)
方法时,是否正好有一个对服务的insertStudent(Student)的调用
使用相同的学生
实例
然后为不同的场景创建单元测试,即处理null
s等
我有一个简单的JavaSpringRESTAPI应用程序
你应该早点开始考虑单元测试。执行这些操作的最佳方法是在生产代码实现(新)行为()之前
下面是StudentController类中的post方法
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
这段代码太简单了,不能失败。
为这样的代码编写单元测试需要很长的时间。这样的代码是通过应用程序或模块测试来测试的
一旦有决定要做(例如:根据输入参数对其他对象进行额外调用),我就会开始为此代码编写单元测试
这里的要点是unittests不测试代码——unittests验证所需的行为(在您的需求中表示)。因此,是的:不测试此方法会降低报告中的覆盖率。但是任何覆盖率工具计算的数字都不如需求覆盖率重要,因为没有工具可以计算需求覆盖率,而您只能通过TDD来保证需求覆盖率。如果您想进行单元测试,则不必连接到DB。连接到DB和其他外部服务将被视为集成测试。因此,在测试
StudentService
类时,对数据库的请求将被模拟出来
第二点值得一提的是,您将分别测试控制器类和服务类,但在您的情况下,这些测试看起来非常相似
下面是测试控制器的insertstrudent
方法的一种方法
@RunWith(MockitoJUnitRunner.class)
public class TestStudentContoller {
@Mock
StundentService mockStudentService;
@InjectMocks
StudentController studentController = new StudentController();
@Test
public void testInsertStudent(){
Student student = new Student();
studentContoller.insertStudent(student);
verify(studentService, times(1)).insertStudent(student);
}
由于控制器的insertStudent
方法没有if语句,只有一个分支,因此基本上只需要执行一个测试,控制器基本上调用服务
另一种测试方法是使用SpringsMockMvc
。MockMvc
的好处在于它允许您测试HTTP请求。例如,在本例中,您需要测试控制器的insertStudent
方法是否能够正确地使用JSON学生响应HTTP POST请求
@RunWith(MockitoJUnitRunner.class)
public class TestStudentContoller {
@Mock
StundentService mockStudentService;
@InjectMocks
StudentController studentController = new StudentController();
MockMvc mockMvc;
@Before
public void setup(){
mockMvc = MockMvcBuilders.standAloneSetup(studentController).build();
}
@Test
public void testInsertStudent(){
Student student = new Student();
studentContoller.insertStudent(student);
mockMvc.perform(post("path/to/insert/student")
.accept(MediaType.APPLICATION_JSON)
.andExpect(status().isOk())
.andExpect(content().string("{}"));//put json student in here
verify(studentService, times(1)).insertStudent(student);
}
MockMvc
还有其他很酷的方法,你应该去探索。对控制器进行mockist单元测试可以模拟服务并确保调用正确的方法,你当然可以用JUnit+Mockito来实现。那么就不需要数据库了,因为真正的服务根本没有被使用。@jonrsharpe你能给我一个链接,说明我如何做到这一点吗?已经有很多例子了,我建议进行研究。参见,例如,我不同意“为这样的代码编写单元测试是一个“时间的腰部”。OP正在寻找一种方法来测试它,有很多方法(就像其他人建议的那样)可以做到这一点。