| 知乎专栏 |
<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() {
}
}