SpringBoot进行单元测试

发表于:2018-2-08 14:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:呈呈的小站    来源:个人博客

  概述
  在本文中,我们将看看如何使用Spring Boot中的框架支持编写测试。 我们将介绍可以单独运行的单元测试以及在执行测试之前引导Spring上下文的集成测试。
  工程安装
  我们将在本文中使用的应用程序是一个API,它提供了一些员工资源的基本操作。 这是一个典型的分层架构 - API调用从Controller到Service到Persistence层。
  Maven 依赖
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <version>1.5.3.RELEASE</version>
  </dependency>
  <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>test</scope>
      <version>1.4.194</version>
  </dependency>
  用@DataJpaTest 测试持久层
  示例实体
  @Entity
  @Table(name = "person")
  public class Employee {
   
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
   
      @Size(min = 3, max = 20)
      private String name;
   
      // standard getters and setters, constructors
  }
  持久库
  @Repository
  public interface EmployeeRepository extends JpaRepository<Employee, Long> {
   
      public Employee findByName(String name);
   
  }
  单元测试示便
  @RunWith(SpringRunner.class)
  @DataJpaTest
  public class EmployeeRepositoryTest {
   
      @Autowired
      private TestEntityManager entityManager;
   
      @Autowired
      private EmployeeRepository employeeRepository;
   
      // write test cases here
   
  }
  测试函数:
  @Test
  public void whenFindByName_thenReturnEmployee() {
      // given
      Employee alex = new Employee("alex");
      entityManager.persist(alex);
      entityManager.flush();
   
      // when
      Employee found = employeeRepository.findByName(alex.getName());
   
      // then
      assertThat(found.getName())
        .isEqualTo(alex.getName());
  }
  用@MockBean 测试服务层
  示例服务层
  @Service
  public class EmployeeServiceImpl implements EmployeeService {
   
      @Autowired
      private EmployeeRepository employeeRepository;
   
      @Override
      public Employee getEmployeeByName(String name) {
          return employeeRepository.findByName(name);
      }
  }
  测试用例
  @RunWith(SpringRunner.class)
  public class EmployeeServiceImplTest {
   
      @TestConfiguration
      static class EmployeeServiceImplTestContextConfiguration {
    
          @Bean
          public EmployeeService employeeService() {
              return new EmployeeServiceImpl();
          }
      }
   
      @Autowired
      private EmployeeService employeeService;
   
      @MockBean
      private EmployeeRepository employeeRepository;
   
      // write test cases here
  }
  测试函数:
  @Test
  public void whenValidName_thenEmployeeShouldBeFound() {
      String name = "alex";
      Employee found = employeeService.getEmployeeByName(name);
    
       assertThat(found.getName())
        .isEqualTo(name);
   }
  用@WebMvcTest 测试web
  web层示例
  @RestController
  @RequestMapping("/api")
  public class EmployeeRestController {
   
      @Autowired
      private EmployeeService employeeService;
   
      @GetMapping("/employees")
      public List<Employee> getAllEmployees() {
          return employeeService.getAllEmployees();
      }
  }
  测试用例:
  @RunWith(SpringRunner.class)
  @WebMvcTest(EmployeeRestController.class)
  public class EmployeeRestControllerTest {
   
      @Autowired
      private MockMvc mvc;
   
      @MockBean
      private EmployeeService service;
   
      // write test cases here
  }
  测试函数:
  @Test
  public void givenEmployees_whenGetEmployees_thenReturnJsonArray()
    throws Exception {
       
      Employee alex = new Employee("alex");
   
      List<Employee> allEmployees = Arrays.asList(alex);
   
      given(service.getAllEmployees()).willReturn(allEmployees);
   
      mvc.perform(get("/api/employees")
        .contentType(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$", hasSize(1)))
        .andExpect(jsonPath("$[0].name", is(alex.getName())));
  }
  用@SpringBootTest进行集成测试
  结论
  在本教程中,我们深入介绍了Spring Boot中的测试支持,并展示了如何高效编写单元测试。
  本文的完整源代码可以在GitHub上找到。源代码包含更多的示例和各种测试用例。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号