前言
很多公司都有寫單元測試的硬性要求,在提交代碼的時候,如果單測通不過或者說單元測試各種覆蓋率不達標,會被拒絕合並代碼。寫單元測試,也是保證代碼質量的一種方式。
junit單元測試
相信絕大多數的Java開發者都用過Junit來寫單元測試。
引入依賴:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
直接在方法上加上@Test注解即可:

加了@Test注解,就會有一個運行的圖標了。
spring的依賴問題
現在的Java開發,基本上離不開spring了。但是使用spring,寫單測的時候就會存在一個依賴注入的問題。
假設有如下一個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());
}
}
運行報錯:

springboot寫單元測試
在springboot中,解決spring依賴問題,非常的簡單。只需要它提供的幾個注解即可:
引入依賴:
<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等),本文都沒有涉及,有興趣的可以了解下。
