繁体   English   中英

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

[英]Unit testing a REST API in Java and Spring

我有一个简单的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中使用超级测试,它可以照顾所有人,我也可以使用JUnit或Mockito做到这一点吗?

如果要进行单元测试,则不必连接到数据库。 连接数据库和其他外部服务将被视为集成测试。 因此,在测试StudentService类时,将嘲笑对数据库的请求。

值得一提的第二点是,您将分别测试控制器类和服务类,但是在您的情况下,这些测试看起来非常相似。

下面是测试控制器的insertStrundent方法的一种方法。

@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语句,只有一个分支,因此基本上只需要执行一个测试,因此控制器会调用服务。

可以测试它的另一种方法是使用Springs MockMvc 关于MockMvc是,它可以让您测试HTTP请求。 例如,在这种情况下,您将要测试控制器的insertStudent方法是否可以使用JSON Student正确响应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还有其他MockMvc方法,您应该探索。

我有一个简单的Java Spring REST API应用程序

您应该更早地开始考虑单元测试。 最好的方法是生产代码实现(新)行为( TDD )之前。

这是StudentController类中的post方法

 @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public void insertStudent(@RequestBody Student student){ studentService.insertStudent(student); } 

这段代码太简单了,以至于无法失败 为此类代码编写单元测试是很长的时间。 这样的代码通过应用程序模块测试进行了测试

一旦做出决定 (例如:根据输入参数对其他对象的额外调用),我将开始为该代码编写单元测试。

这里的重点是单元测试不测试代码 -单元测试验证所需的行为 (在您的需求中表示)。 所以可以:不测试此方法会减少报告的覆盖范围。 但是,任何覆盖率工具计算的数量都比没有工具可以计算并且只能通过执行TDD才能保证的需求覆盖率重要。

您要模拟studentService并进行单元测试,以验证当调用API的方法insertStudent(Student) ,对于具有相同Student实例的服务的insertStudent(Student)确实存在一个调用。

然后针对不同的场景创建单元测试,即处理null等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM