不少公司都有寫單元測試的硬性要求,在提交代碼的時候,若是單測通不過或者說單元測試各類覆蓋率不達標,會被拒絕合併代碼。寫單元測試,也是保證代碼質量的一種方式。java
相信絕大多數的Java開發者都用過Junit來寫單元測試。spring
引入依賴:數據庫
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
複製代碼
直接在方法上加上@Test註解便可:springboot
加了@Test註解,就會有一個運行的圖標了。mvc
如今的Java開發,基本上離不開spring了。可是使用spring,寫單測的時候就會存在一個依賴注入的問題。spring-boot
假設有以下一個Service:單元測試
@Service
public class TestService {
public String getString() {
return "Hello World!";
}
}
複製代碼
在Junit中直接自動裝配:測試
public class JunitTest {
@Autowired
private TestService testService;
@Test
public void test() {
System.out.println(testService.getString());
}
}
複製代碼
運行報錯:spa
在springboot中,解決spring依賴問題,很是的簡單。只須要它提供的幾個註解便可:3d
引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
複製代碼
這裏引入了一個spring-boot-starter-test依賴,是springboot中寫單測所須要的。
在單元測試類上添加@RunWith(SpringRunner.class)、@SpringBootTest註解:
這時候就能夠正常的把spring依賴注入進來了,運行方法,能夠看到springboot啓動時的輸出:
若是是經過spring initialize建立的springboot項目(本系列第一篇文章有講解),其實會自動建立一個單元測試類:
咱們在寫單元測試的時候,直接繼承這個類便可。
寫單元測試,不免須要操做數據庫。有時候單元測試的數據庫跟開發時候的數據庫是同一個,爲了避免影響數據庫的數據,須要在單測完成以後,將操做回滾。這在springboot中也是很容易解決的事情,只須要將單測類繼承AbstractTransactionalJUnit4SpringContextTests便可
數據庫有數據以下:
單元測試類以下:
測試方法以下:
@Test
public void deleteAll() {
userRepo.deleteAll();
}
複製代碼
執行方法後,若是事務不會滾,則會清除user表中的全部數據。
經過結果查看,單測運行沒有問題,查看數據庫:
數據也沒有被刪除,證實事務已經回滾了。
把繼承的AbstractTransactionalJUnit4SpringContextTests類去掉,再次執行deleteAll方法:
數據庫中的數據已被刪除
本文介紹了springboot中寫單元測試的方法。其實優雅的寫單元測試須要涉及到不少東西,好比mock(mockito、mockmvc等),本文都沒有涉及,有興趣的能夠了解下。