在Java和Spring中对REST API进行单元测试
在Java和Spring中对REST API进行单元测试
我有一个简单的Java Spring REST API应用程序,但我不知道如何对其进行单元测试。我已经阅读了JUnit和Mockito的文档,但是我无法弄清楚怎么做。
这是StudentController类中的post方法:
@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中做到这一点?
在Java和Spring中对REST API进行单元测试的原因是,单元测试不需要连接数据库。连接数据库和其他外部服务被认为是集成测试。因此,在测试StudentService
类时,对数据库的请求将被模拟。
另一个值得一提的点是,您会分别测试控制器类和服务类,但在您的情况下,这些测试看起来非常相似。
以下是一种测试控制器insertStrundent
方法的方法。
(MockitoJUnitRunner.class) public class TestStudentContoller { StundentService mockStudentService; StudentController studentController = new StudentController(); public void testInsertStudent(){ Student student = new Student(); studentContoller.insertStudent(student); verify(studentService, times(1)).insertStudent(student); }
由于您的控制器的insertStudent
方法没有if语句,只有一个分支,因此基本上只需要执行一个测试,即控制器是否调用了服务。
另一种测试方法是使用Spring的MockMvc
。 MockMvc
的好处是它允许您测试HTTP请求。例如,在这种情况下,您希望测试控制器的insertStudent
方法是否能正确响应带有JSON Student的HTTP POST请求。
(MockitoJUnitRunner.class) public class TestStudentContoller { StundentService mockStudentService; StudentController studentController = new StudentController(); MockMvc mockMvc; public void setup(){ mockMvc = MockMvcBuilders.standAloneSetup(studentController).build(); } public void testInsertStudent(){ 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
还有其他一些很酷的方法,您可以探索一下。
问题的出现原因是这段代码太简单,写单元测试是浪费时间。这段代码可以通过应用程序或模块测试进行测试。在代码有决策时,才需要编写单元测试。单元测试不是测试代码,而是验证所需行为(在需求中表达)。虽然不测试这个方法会减少报告中的覆盖率,但覆盖率工具计算的数字不如无法计算的需求覆盖率重要。虽然有人提出了其他方法,但我不同意“编写这样的代码的单元测试是浪费时间”。
解决方法是在编写代码之前先考虑编写单元测试。这样可以通过测试驱动开发(TDD)的方式,确保代码实现了所需的行为。
文章标题:在Java和Spring中对REST API进行单元测试的原因和解决方法
我有一个简单的Java Spring REST API应用程序。你应该尽早考虑编写单元测试。最好的方法是在生产代码实现(新的)行为之前进行单元测试(TDD)。
以下是StudentController类中的post方法:
(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public void insertStudent(Student student){ studentService.insertStudent(student); }
这段代码太简单了,写单元测试是浪费时间。这样的代码通过应用程序或模块测试进行测试。只有在有决策时(例如:根据输入参数进行其他对象的额外调用),才需要为这段代码编写单元测试。这里的重点是,单元测试不是测试代码,而是验证所需的行为(在需求中表达)。是的,不测试这个方法会降低报告中的覆盖率。但是,覆盖率工具计算的数字不如无法计算的需求覆盖率重要。只有通过TDD才能保证需求覆盖率,而没有任何工具可以计算需求覆盖率。
我不同意“编写这样的代码的单元测试是浪费时间”。原作者正在寻找测试的方法,而且有其他方法可以做到这一点(如其他人提出的建议)。