当前位置: 首页 > 知识库问答 >
问题:

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

潘高岑
2023-03-14

我有一个简单的JavaSpringRESTAPI应用程序,我不知道如何对它进行单元测试。我读过JUnit和Mockito的纪录片,但我想不出来。

下面是StudentController类中的post方法

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

这是在学生服务类中的插入学生方法

public void insertStudent(Student student) {
        studentDao.insertStudent(student);
    }

我使用MySQL作为数据库。我应该在单元测试中也使用数据库吗?我的意思是我不想要任何集成测试。我只需要单元测试。我在节点中使用supertest。js和它照顾所有人,我可以用JUnit或Mockito也这样做吗?

共有3个答案

施永贞
2023-03-14

您希望模拟studentService,并进行单元测试,以验证当调用API的方法insertStudent(Student)时,使用相同的Student实例调用服务的insertStudent(Student)

然后为不同的场景创建单元测试,即处理nulls等。。

拓拔泓
2023-03-14

我有一个简单的JavaSpringRESTAPI应用程序

你应该早点开始考虑单元测试。最好的方法是在生产代码实现(新)行为(TDD)之前执行这些操作。

下面是StudentController类中的post方法

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

这段代码太简单了,不能失败。为这样的代码编写单元测试需要很长的时间。这样的代码是通过应用程序或模块测试来测试的

一旦有决定要做(例如:根据输入参数对其他对象进行额外调用),我就会开始为此代码编写单元测试。

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

司马高昂
2023-03-14

如果您想进行单元测试,那么就不必连接到数据库。连接到DB和其他外部服务将被视为集成测试。因此,在测试StudentService类时,对数据库的请求将被模拟出来。

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

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

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

另一种测试方法是使用SpringsMockMvcMockMvc的好处在于它允许您测试HTTP请求。例如,在本例中,您需要测试控制器的insertStudent方法是否能够正确地使用JSON学生响应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还有其他很酷的方法,你应该去探索。

 类似资料:
  • 我不完全确定这是否是适合这种问题的地方,但我会试着至少花几分钟来摆脱他们称之为Spring靴测试的地狱。 我正在寻找任何关于测试的最新信息资源(书籍/网站等)。 我是java/kotlin开发人员,现在已经进入第四个年头了,我觉得自己对java/kotlin和Spring Boot软件的理解还不错。但有一个类别让我感到震惊。测试、单元和Rest。 无论出于什么原因,每次我尝试进行新的测试或更新旧的

  • 问题内容: 我想为一些连接到数据库,运行一个或多个查询然后处理结果的代码编写一些单元测试。(实际上没有使用数据库) 这里的另一个开发人员编写了我们自己的DataSource,Connection,Statement,PreparedStatement和ResultSet实现,这些实现将基于xml配置文件返回相应的对象。(我们可以使用伪造的数据源,并针对返回的结果集运行测试)。 我们在这里重新发明轮

  • 我已经为我的应用程序编写了自定义的JsonSerializer和JsonDeserializer。现在我想为它们编写一些单元测试。

  • 我正在用Groovy开发,并试图为以下使用Spring的RestTemplate编写一个Spock单元测试... 其中包括我的请求回调和响应提取器,以及我的RestTemplate bean的初始化类。我正在使用ResponseExtractor将来自的响应流化,并将其复制到一个文件中。RequestCallback只是在请求上设置一些头。 特定方法的Spring框架文档:https://docs

  • 问题内容: 我的公司一直在评估Spring MVC,以确定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的内容,现在,我正在查看Spring Security模块,以确定是否可以/应该使用它。 我们的安全要求非常基本。用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上的页面很少(常见问题解答,支持等),应该为匿名用户提供访问权限。 在我创建的

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样: