Spring Boot 单元测试

本文主要介绍Spring Boot应用程序Controller,Service 和 Repository层单元测试的写法。

1. Controller

Spring Boot提供了@WebMvcTest声明来加载只包括了需要测试web controller的bean的应用上下文,通过参数指定要测试和加载的具体controller类。

@MockBean: 使用此注解注入的类,表明类中的所有方法都使用自定义返回的值,这样在测试的时候就不会真的去调用远程接口,而是返回一个我们预设的值。

代码示例:

@WebMvcTest(value = StudentController.class)
class StudentControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private StudentService studentService;

    @MockBean
    private CourseRepository courseRepository;

    @Test
    void findAllCourse() {
    }

    @Test
    void findAllStudent() throws Exception{
        Mockito.when(studentService.findAllStudent()).thenReturn(new ArrayList<>());

        RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/findAllStudent");
        MvcResult result = mockMvc.perform(requestBuilder).andReturn();
    }
}

 

2. Service

注意Mock的初始化:MockitoAnnotations.initMocks

代码示例:

@RunWith(MockitoJUnitRunner.class)
class StudentServiceTest {

@Mock
private StudentRepository studentRepository;

@InjectMocks
private StudentService studentService;

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);
}
    @Test
    void findAllStudent() {
        Mockito.when(studentRepository.findAll()).thenReturn(new ArrayList<>());
        studentService.findAllStudent();
    }
}

  

@Mock与@MockBean的区别

  • Mock一般用在不依赖框架的单元测试

  • MockBean用在依赖Spring上下文环境

3. Repository

@DataJpaTest: 默认使用内存数据库H2,且case具有事务性,当testcase运行结束时,会自动回滚插入数据

代码示例:

@DataJpaTest
class StudentRepositoryTest {

    @Autowired
    private StudentRepository studentRepository;

    private Student student;

    @BeforeEach
    void setUp() {
        student = new Student();
        student.setId("stu0001");
        student.setName("Aaron");
        student.setDescription("Aaron Qin");
    }

    @Test
    public void saveStudent(){
        Student savedStudent = studentRepository.save(student);
    }

    @AfterEach
    void tearDown() {
    }
}

  

posted @ 2022-02-23 11:12  梅花瘦  阅读(169)  评论(0)    收藏  举报