【快學springboot】在springboot中寫單元測試


前言

很多公司都有寫單元測試的硬性要求,在提交代碼的時候,如果單測通不過或者說單元測試各種覆蓋率不達標,會被拒絕合並代碼。寫單元測試,也是保證代碼質量的一種方式。

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等),本文都沒有涉及,有興趣的可以了解下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM