Spring Boot 測試

Spring Boot 測試

1. 添加pom測試依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2. 測試類

// 在測試環境中轉配,裝配的Bean只會在測試環境中使用
@TestConfiguration
public class MyTestConfiguration {

    @Bean
    public Runnable create() {
        return () -> {
        };
    }
}


@RunWith(SpringRunner.class)
// 指定在測試環境中裝配的配置類
@SpringBootTest(classes = MyTestConfiguration.class)
public class DictDaoTest {
    @Autowired
    private DictDao dictDao;
    @Autowired
    private ApplicationContext context;

    @Test
    public void testList() {
        List<Map<String, Object>> result = dictDao.list();
        for (Map<String, Object> map : result) {
            System.out.println(map);
        }
        Assert.assertNotNull(context.getBean(Runnable.class));
    }

}

注意: Spring Boot 會優先使用測試環境的配置文件,如果沒有才會使用正式的配置文件

3. 測試環境中使用配置項

@RunWith(SpringRunner.class)
// 測試環境中添加配置項,方式1
@SpringBootTest(properties = { "app.version=1.0.0" })
public class EnvironmentTest {
    @Autowired
    private ConfigurableEnvironment env;
    @Value("${app.version}")
    private String version;

    // 添加配置項,方式2
    @Before
    public void init() {
        TestPropertyValues.of("test.username=root").and("test.password=123456").applyTo(env);
    }

    @Test
    public void test() {
        Assert.assertEquals("1.0.0", env.getProperty("app.version"));
        Assert.assertEquals("1.0.0", version);
        Assert.assertEquals("root", env.getProperty("test.username"));
        Assert.assertEquals("123456", env.getProperty("test.password"));

    }
}

4. Controller 測試

@RestController
public class StudentController {

    @GetMapping("student/{id}")
    public String get(@PathVariable("id") Long id) {
        return "student" + id;
    }

    @GetMapping("student/list")
    public String list() {
        return "student";
    }
}

1. 測試Restful接口

@RunWith(SpringRunner.class)
//不需要啓動Spring Boot服務,但需要指定本處使用的端口方式
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class StudentControllerTest {
    //Rest測試模板類
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testGet() {
        String result = restTemplate.getForObject("/student/100", String.class);
        Assert.assertEquals("student100", result);
    }

    @Test
    public void testList() {
        String result = restTemplate.getForObject("/student/list", String.class);
        Assert.assertEquals("student", result);
    }

}

2. 使用Mock測試WebController

注意:

@WebMvcTest 只能測試Controller,Controller中不能依賴注入其他Bean,原因是:這種方式不會加載Spring 容器

@RunWith(SpringRunner.class)
// WebMvc測試方式,需要指定測試的Controller。不需要在Web環境下運行
@WebMvcTest(controllers = { StudentController.class })
public class StudentControllerMvcTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void testGet() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/student/100"))//
                .andExpect(MockMvcResultMatchers.status().isOk()) // 匹配結果狀態碼爲200
                .andExpect(MockMvcResultMatchers.content().string("student100"));// 匹配返回結果

    }

    @Test
    public void testList() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/student/list").param("name", "張三"))//
                .andExpect(MockMvcResultMatchers.status().isOk())//
                .andExpect(MockMvcResultMatchers.content().string("student"));
    }
}

3. 使用Mock方式測試WebController

注意:

@SpringBootTest 註解使用時會加載Spring容器,但是不會自動注入MockMvc對象,需要配合@AutoConfigureMockMvc註解,自動注入MockMvc對象。這兩個註解不能和@WebMvcTest註解同時使用

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class StudentControllerMvcTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void testGet() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/student/100"))//
                .andExpect(MockMvcResultMatchers.status().isOk()) // 匹配結果狀態碼爲200
                .andExpect(MockMvcResultMatchers.content().string("student100"));// 匹配返回結果

    }

    @Test
    public void testList() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/student/list").param("name", "張三"))//
                .andExpect(MockMvcResultMatchers.status().isOk())//
                .andExpect(MockMvcResultMatchers.content().string("student"));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章