我在很多項目中一直在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
並執行它一樣糟糕。但在這種方法中是否真的有缺點?
這是[constant interface antipattern](http://en.wikipedia.org/wiki/Constant_interface)上的變體。不惜一切代價避免它。 'default'方法應該是屬於'interface'的東西的一個合理的默認實現。使用'static'工具方法,'import static'去除類名。 –
只要靜態導入方法,如果你不想羅嗦。 – chrylis