在Java和Spring中对REST API进行单元测试

13 浏览
0 Comments

在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中做到这一点?

0
0 Comments

在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的MockMvcMockMvc的好处是它允许您测试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还有其他一些很酷的方法,您可以探索一下。

0
0 Comments

问题的出现原因是这段代码太简单,写单元测试是浪费时间。这段代码可以通过应用程序或模块测试进行测试。在代码有决策时,才需要编写单元测试。单元测试不是测试代码,而是验证所需行为(在需求中表达)。虽然不测试这个方法会减少报告中的覆盖率,但覆盖率工具计算的数字不如无法计算的需求覆盖率重要。虽然有人提出了其他方法,但我不同意“编写这样的代码的单元测试是浪费时间”。

解决方法是在编写代码之前先考虑编写单元测试。这样可以通过测试驱动开发(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才能保证需求覆盖率,而没有任何工具可以计算需求覆盖率。

我不同意“编写这样的代码的单元测试是浪费时间”。原作者正在寻找测试的方法,而且有其他方法可以做到这一点(如其他人提出的建议)。

0
0 Comments

问题的出现原因:为了验证API的方法调用了一个特定的服务方法,并且验证该方法只被调用一次,参数也相同。

解决方法:创建单元测试来模拟studentService,并验证当API的insertStudent(Student)方法被调用时,确实只调用了一次服务的insertStudent(Student)方法,参数也相同。然后为不同的场景创建单元测试,如处理null等。

0