知乎专栏 | 多维度架构 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
创建测试类,在测试类的类头部添加:@RunWith(SpringRunner.class)和@SpringBootTest注解,在测试方法的前添加@Test,最后选择方法右键run运行。
@RunWith(SpringRunner.class) @SpringBootTest public class WalletTest { @Autowired WalletService walletService; public WalletTest() { // TODO Auto-generated constructor stub } @Test public void test() throws Exception { Assert.assertEquals(5,5); } }
@RunWith 在JUnit中有很多个Runner,他们负责调用你的测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。 如果我们只是简单的做普通Java测试,不涉及Spring Web项目,你可以省略@RunWith注解,这样系统会自动使用默认Runner来运行你的代码。 //在所有测试方法前执行一次,一般在其中写上整体初始化的代码 @BeforeClass //在所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码 @AfterClass //在每个测试方法前执行,一般用来初始化方法(比如我们在测试别的方法时,类中与其他测试方法共享的值已经被改变,为了保证测试结果的有效性,我们会在@Before注解的方法中重置数据) @Before //在每个测试方法后执行,在方法执行完成后要做的事情 @After // 测试方法执行超过1000毫秒后算超时,测试将失败 @Test(timeout = 1000) // 测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败 @Test(expected = Exception.class) // 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类 @Ignore("not ready yet") @Test
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Application.class) public class ApplicationTests { @Autowired private UserRepository userRepository; @Autowired private MessageRepository messageRepository; @Test public void test() throws Exception { userRepository.save(new User("Neo", 10)); userRepository.save(new User("Jam", 20)); userRepository.save(new User("Tom", 30)); userRepository.save(new User("Sam", 40)); userRepository.save(new User("Leo", 50)); Assert.assertEquals(5, userRepository.findAll().size()); messageRepository.save(new Message("Neo", "How are you?")); messageRepository.save(new Message("Jam", "Hi!")); messageRepository.save(new Message("Sam", "What's going on?")); Assert.assertEquals(3, messageRepository.findAll().size()); } }
package cn.netkiller.rest; import java.net.URI; import java.net.URISyntaxException; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; import cn.netkiller.rest.model.Employee; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) public class SpringBootDemoApplicationTests { @Autowired private TestRestTemplate restTemplate; @LocalServerPort int randomServerPort; @Test public void testAddEmployeeSuccess() throws URISyntaxException { final String baseUrl = "http://localhost:"+randomServerPort+"/employees/"; URI uri = new URI(baseUrl); Employee employee = new Employee(null, "Adam", "Gilly", "test@email.com"); HttpHeaders headers = new HttpHeaders(); headers.set("X-COM-PERSIST", "true"); HttpEntity<Employee> request = new HttpEntity<>(employee, headers); ResponseEntity<String> result = this.restTemplate.postForEntity(uri, request, String.class); //Verify request succeed Assert.assertEquals(201, result.getStatusCodeValue()); } @Test public void testAddEmployeeMissingHeader() throws URISyntaxException { final String baseUrl = "http://localhost:"+randomServerPort+"/employees/"; URI uri = new URI(baseUrl); Employee employee = new Employee(null, "Adam", "Gilly", "test@email.com"); HttpHeaders headers = new HttpHeaders(); HttpEntity<Employee> request = new HttpEntity<>(employee, headers); ResponseEntity<String> result = this.restTemplate.postForEntity(uri, request, String.class); //Verify bad request and missing header Assert.assertEquals(400, result.getStatusCodeValue()); Assert.assertEquals(true, result.getBody().contains("Missing request header")); } }
创建测试类,在测试类的类头部添加:@RunWith(SpringRunner.class)、@SpringBootTest、@ AutoConfigureMockMvc注解,在测试方法的前添加@Test,最后选择方法右键run运行。
使用@Autowired 注入MockMvc,在方法中使用 mvc测试功能。示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class StudentControllerTest { @Autowired private MockMvc mvc; @Test public void getAll() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/student/getAll")).andExpect(MockMvcResultMatchers.model().attributeExists("students")); } @Test public void save() throws Exception { Student student = new Student(); student.setAge(12); student.setId("1003"); student.setName("Neo"); mvc.perform(MockMvcRequestBuilders.post("/student/save", student)); } @Test public void delete() throws Exception { mvc.perform(MockMvcRequestBuilders.delete("/student/delete?id=1002")); } @Test public void index() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/student/index")).andReturn(); } }
package cn.netkiller.webflux; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) @SpringBootTest public class WebfluxApplicationTests { @Test public void contextLoads() { } private WebTestClient webTestClient; @Before public void setUp() { this.webTestClient = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build(); } @Test public void sample() throws Exception { this.webTestClient.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello world!"); } @Test public void client() { } }