你應(yīng)該更新的Java知識(shí)之常用程序庫(二)

Hamcrest

一句話,如果你寫單元測(cè)試,就應(yīng)該用Hamcrest。

如今不寫單元測(cè)試,你都不好意思說自己在做工程項(xiàng)目了。但你一般這么寫斷言呢?如果你還寫成下面這樣,我只能說你落伍了:

assertEquals(a, b);

請(qǐng)告訴我,哪個(gè)是執(zhí)行結(jié)果,哪個(gè)是預(yù)期結(jié)果,不管你是怎樣,反正大多數(shù)情況下,我是記不住的。所以,這個(gè)在只重功能不重可讀性年代產(chǎn)生的API該更新了。于是,Hamcrest就是為了解決這樣的問題而生的。

assertThat(a, is(b));

很明顯,前面一個(gè)是執(zhí)行結(jié)果,后面一個(gè)是預(yù)期結(jié)果,當(dāng)然這只是一個(gè)簡單的例子。由于Hamcrest引入了matcher的概念(就是你看到的is部分),我們可以進(jìn)行更多的組合:

assertThat(number, greaterThan(5));

assertThat(text, startsWith("Hello"));

assertThat(array, hasItem("World"));

Hamcrest如此好用,以至于JUnit已經(jīng)將其吸納進(jìn)去。如果你現(xiàn)在用的JUnit4.4之后的版本,那你已經(jīng)有了Hamcrest。無需額外的配置,就可以拿過來用。

Mockito

寫單元測(cè)試不用Mock框架幾乎是一件不可能的事,我是說Mock框架,不是Mock模式哦!對(duì)于老Java程序員來說,提起Mock框架,率先在腦海中撞線的多半是JMockEasyMock。

使用Mockito,只要有一個(gè)理由就夠了,簡單。相比于JMock,它不用寫checking,相比于EasyMock,它省去了replay。下面是個(gè)例子:

List mockedList = mock(List.class);

when(mockedList.get(0)).thenReturn("first");

System.out.println(mockedList.get(0));

當(dāng)然,Mockito還是非常強(qiáng)大的。

最后再強(qiáng)調(diào)一遍,無論使用哪個(gè)框架,請(qǐng)盡量不要使用verify,也就是傳說中的Mock模式,那是把代碼拉入泥潭的開始。

SLF4JLogback

日志幾乎是稍微有點(diǎn)規(guī)模的項(xiàng)目躲不開的一個(gè)東西,如果你是個(gè)老Java程序員,你必然知道Log4J,多半也知道Commons Logging。是時(shí)候把它們?nèi)拥袅耍驗(yàn)橛?/SPAN>SLF4JLogback了。SLF4J要替代Commons Logging,而Logback的目標(biāo)是Log4J

程序員里憤青多,SLF4JLogback的作者就是一個(gè),他叫Ceki Gülcü,事實(shí)上,他也是Log4J的作者。Log4J的開發(fā)狀態(tài)實(shí)在讓他太不爽了,于是,他另起爐灶,打造出新的替代品。

只憑一點(diǎn)就足以讓我們對(duì)SLF4J義無反顧了,你還記得用Commons Logging寫出這樣的代碼嗎?

if (logger.debugEnable()) {

logger.debug("Hello, ", name);

}

SLF4J的寫法只有一句話:

logger.debug("Hello, {}", name);

從根源來說,這是時(shí)代造成的,Commons LoggingJava 5之前產(chǎn)生的,那時(shí)候還沒有變參,所以,我們不得不說,它老了。

至于Logback,性能是最重要的噱頭,當(dāng)然,還有一些其它的理由。理由里有一點(diǎn)并未提及,但對(duì)于開發(fā)人員很貼心的改進(jìn),就是日志模式的改進(jìn),還記得Log4J那密碼一樣的日志模式嗎?

%d{dd MMM yyyy HH:mm:ss} [%t] %-5p %m%n

下面是Logback的版本,不用查文檔,我也看出每段表示的都是什么:

%d{dd MMM yyyy HH:mm:ss} [%thread] %-5level %msg%n

    這里介紹的幾個(gè)程序庫都是很通用的,無論是你做怎樣的開發(fā),應(yīng)該都或多或少給你一些幫助。時(shí)間未曾停步,Java開發(fā)也未曾停留,時(shí)候更新一下自己的知識(shí)了。
北大青鳥網(wǎng)上報(bào)名
北大青鳥招生簡章