2015-04-12 31 views
0

我在很多項目中一直在Java中進行TDD,而且我總是必須處理在某些測試之間共享某些常見斷言的情況。我之前的Java 8解決方案總是看起來像這樣。Java 8:靜態助手與默認的常用測試斷言方法

與普通的斷言和靜態方法的類:像這樣來使用

class CommonAssertions { 
    static void assertCorrectUser(User user) { 
    // bunch of assertions 
    } 
} 

class FooTest { 
    @Test 
    void somethingToDoWithUser() { 
    User user = // obtain user somehow 
    CommonAssertions.assertCorrectUser(user); 
    } 
} 

現在與Java 8我忍不住要使用的界面與default方法常見斷言:

interface CommonAssertions { 
    default assertCorrectUser(User user) { 
    // bunch of assertions on user 
    } 
} 

然後,而不是靜態調用我會設計我的測試像這樣:

class FooTest implements CommonAssertions { ... } 

它非常相似,但似乎第二個更容易使用(節省大量靜態導入)並揭示更多關於測試的信息。圖片代碼,如:

class CompanyResourceTest implements UserAssertions, CompanyAssertions, JsonErrorAssertions { ... }

有人可能會說default設計完全不同的東西,這是一個誤用。有些人可能會爭辯說,這和將一堆常量放入interface並執行它一樣糟糕。但在這種方法中是否真的有缺點

+2

這是[constant interface antipattern](http://en.wikipedia.org/wiki/Constant_interface)上的變體。不惜一切代價避免它。 'default'方法應該是屬於'interface'的東西的一個合理的默認實現。使用'static'工具方法,'import static'去除類名。 –

+1

只要靜態導入方法,如果你不想羅嗦。 – chrylis

回答

0

缺點是不清楚。接口是未指定實現細節的合同。通過使用所有默認方法,您就會濫用專門設計的接口,這通常會使代碼難以被其他人理解。由於Java不支持mixin或traits,因此Java的使用受到限制,並且使用默認接口對於它來說只是一種拙劣的方式。

靜態方法是爲這個在Java中的常態,但如果你真的不是他們,我建議幾個選擇:

  • 寫你的測試,支持混入一種語言,如groovy 或scala
  • 創建一個通用的基礎測試類,例如UserTest,並讓您的用戶相關測試擴展它。不理想,特別是如果你需要多重繼承。
  • 編寫可以在您的測試中注入這些方法的註釋,因此您可以使用可在這些方法中編譯的@UserTest。