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

jc3wubiy  于 2023-06-21  发布在  Spring
关注(0)|答案(3)|浏览(143)

我有一个简单的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来做吗?

rdrgkggo

rdrgkggo1#

如果你想做单元测试,那么你就不必连接到数据库。连接到数据库和其他外部服务将被视为集成测试。因此,在测试StudentService类时,对DB的请求将被模拟出来。
值得一提的第二点是,您将分别测试控制器类和服务类,但在您的情况下,这些测试看起来非常相似。
下面是测试控制器的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 MockMvcMockMvc的优点是它允许您测试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(){

        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还有其他很酷的方法,你应该探索一下。

j91ykkif

j91ykkif2#

我有一个简单的JavaSpringREST API应用程序
你真的应该早点开始考虑unittests。最好的方法是在产品代码实现(新)行为(TDD)之前。
下面是StudentController类中的post方法

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

这段代码太简单以至于不能失败。为这样的代码编写单元测试是浪费时间的。这样的代码通过 * application * 或 * module tests * 进行测试
一旦有了一些 * 决定 *,我就会开始为这段代码编写unittests(例如:取决于输入参数对其它对象的附加调用)。
这里的要点是,单元测试不测试代码-单元测试验证期望的行为(在您的需求中表达)。所以是的:不测试这个方法会减少报告的覆盖率。但是任何覆盖率工具计算的数字都不如 * 需求覆盖率 * 重要,没有任何工具可以计算需求覆盖率,并且您只能通过TDD来保证需求覆盖率。

j8ag8udp

j8ag8udp3#

您希望模拟studentService并进行单元测试,以验证当调用API的方法insertStudent(Student)时,是否正好有一个对服务的insertStudent(Student)的调用,该调用具有相同的Student示例。
然后为不同的场景创建单元测试,例如处理null等。

相关问题