我有一个简单的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来做吗?
3条答案
按热度按时间rdrgkggo1#
如果你想做单元测试,那么你就不必连接到数据库。连接到数据库和其他外部服务将被视为集成测试。因此,在测试
StudentService
类时,对DB的请求将被模拟出来。值得一提的第二点是,您将分别测试控制器类和服务类,但在您的情况下,这些测试看起来非常相似。
下面是测试控制器的
insertStrundent
方法的一种方法。由于控制器的
insertStudent
方法没有if语句,只有一个分支,基本上只有一个测试需要执行,基本上是控制器调用服务。另一种测试方法是使用Springs
MockMvc
。MockMvc
的优点是它允许您测试HTTP请求。例如,在本例中,您可能希望测试控制器的insertStudent
方法是否会正确地响应带有JSON Student的HTTP POST请求。MockMvc
还有其他很酷的方法,你应该探索一下。j91ykkif2#
我有一个简单的JavaSpringREST API应用程序
你真的应该早点开始考虑unittests。最好的方法是在产品代码实现(新)行为(TDD)之前。
下面是StudentController类中的post方法
这段代码太简单以至于不能失败。为这样的代码编写单元测试是浪费时间的。这样的代码通过 * application * 或 * module tests * 进行测试
一旦有了一些 * 决定 *,我就会开始为这段代码编写unittests(例如:取决于输入参数对其它对象的附加调用)。
这里的要点是,单元测试不测试代码-单元测试验证期望的行为(在您的需求中表达)。所以是的:不测试这个方法会减少报告的覆盖率。但是任何覆盖率工具计算的数字都不如 * 需求覆盖率 * 重要,没有任何工具可以计算需求覆盖率,并且您只能通过TDD来保证需求覆盖率。
j8ag8udp3#
您希望模拟
studentService
并进行单元测试,以验证当调用API的方法insertStudent(Student)
时,是否正好有一个对服务的insertStudent(Student)
的调用,该调用具有相同的Student
示例。然后为不同的场景创建单元测试,例如处理
null
等。