2017-06-21 89 views
0

我創建了一個構建Specifications對象的構建器類。它用於創建JpaSpecificationExecutor的查詢。建築商使用,因爲我有很多參數可以是空/空(來自用戶的過濾),沒有它,我不能只使用Specifications如何編寫彈簧規格的單元測試?

public class SpecificationBuilder<T> { 

    private Specifications<T> specification; 

    public SpecificationBuilder() { 

    } 

    public SpecificationBuilder(final Specification<T> spec) { 
     specification = Specifications.where(spec); 
    } 

    public SpecificationBuilder<T> appendOr(final Specification<T> spec) { 
     specification = Specifications.where(spec).or(specification); 
     return this; 
    } 

    public SpecificationBuilder<T> appendAnd(final Specification<T> spec) { 
     specification = Specifications.where(spec).and(specification); 
     return this; 
    } 

    public Specification<T> build() { 
     return Specifications.where(specification); 
    } 

} 

我在這裏的問題是,我不知道如何獨立地測試它。當然,我可以autowire真正的存儲庫(在內存中的數據庫),但我不想介入任何其他類,只測試邏輯,如何創建OR和AND子句。

不幸的是在春季API我無法找到,這將有助於

+0

我不會這樣做,我的意思是寫一個通用規範,我認爲它正在重寫JPA背後的意圖。我只寫了特定的規範,大多數情況下都可以由Spring JPA來處理。當然,只是我個人的看法。 –

+0

我有10個參數可以或不可以爲空/空。我不能寫10!單一規格 – ByeBye

回答

1
  1. 如果你必須測試會談到DB實際代碼的任何方法,使用DbUnit,讓你的生活更輕鬆,並建議您使用HSQLDB,這樣您的測試將能夠在運行時設置其環境,而無需安裝和配置數據庫。 在內部集成測試中,您檢查查詢是否正確,可執行,返回預期結果,數據模型是否有效......您不需要檢查集成測試中的所有可能組合,只檢查預期的正確執行和結果。 (appendOr,appendAnd - 你檢查行爲,不檢查數據,檢查規範構建器是否有預期的行爲 - 應用AND,OR ...謂詞),使用一般嘲笑庫:EasyMock,Mockito或任何其他,並使測試不真正與數據庫交談,這通常會使測試更快,更簡單。

所以,如果你想「測試只有邏輯,如何OR和AND子句創建」您可以使用模擬檢查的創作方式,但你應該有分鐘一個集成測試方法:規範版本( ),用像appendOr,appendAnd標準最大量....

只要例如:這裏是例如如何彈簧數據測試的代碼:利用模擬

單元測試:https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/query/SimpleJpaQueryUnitTests.java

和 整技術n測試: https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreatorIntegrationTests.java

有兩種類型的測試和乳清專用於不同情況。