| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
<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() {
}
}