Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java和Spring中对RESTAPI进行单元测试_Java_Spring_Rest_Unit Testing_Junit - Fatal编程技术网

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

在Java和Spring中对RESTAPI进行单元测试,java,spring,rest,unit-testing,junit,Java,Spring,Rest,Unit Testing,Junit,我有一个简单的JavaSpringRESTAPI应用程序,我不知道如何对它进行单元测试。我读过JUnit和Mockito的纪录片,但我想不出来 下面是StudentController类中的post方法 @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public void insertStudent(@RequestBody Student student

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

下面是StudentController类中的post方法

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void insertStudent(@RequestBody Student student){
        studentService.insertStudent(student);
    }
@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吗?

您想要模拟
studentService
并进行单元测试,以验证当调用API的
insertStudent(Student)
方法时,是否正好有一个对服务的
insertStudent(Student)的调用
使用相同的
学生
实例

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

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

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

下面是StudentController类中的post方法

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void insertStudent(@RequestBody Student student){
        studentService.insertStudent(student);
    }
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void insertStudent(@RequestBody Student student){
        studentService.insertStudent(student);
    }
这段代码太简单了,不能失败。 为这样的代码编写单元测试需要很长的时间。这样的代码是通过应用程序或模块测试来测试的

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


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

如果您想进行单元测试,则不必连接到DB。连接到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语句,只有一个分支,因此基本上只需要执行一个测试,控制器基本上调用服务

另一种测试方法是使用Springs
MockMvc
MockMvc
的好处在于它允许您测试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
还有其他很酷的方法,你应该去探索。

对控制器进行mockist单元测试可以模拟服务并确保调用正确的方法,你当然可以用JUnit+Mockito来实现。那么就不需要数据库了,因为真正的服务根本没有被使用。@jonrsharpe你能给我一个链接,说明我如何做到这一点吗?已经有很多例子了,我建议进行研究。参见,例如,我不同意“为这样的代码编写单元测试是一个“时间的腰部”。OP正在寻找一种方法来测试它,有很多方法(就像其他人建议的那样)可以做到这一点。