使用EasyMock或Mockito
生活随笔
收集整理的這篇文章主要介紹了
使用EasyMock或Mockito
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我大部分時(shí)間都在使用EasyMock ,但是最近我和一些非常愿意使用Mockito的人一起工作。
我不打算在同一項(xiàng)目中使用兩個(gè)框架來(lái)實(shí)現(xiàn)相同的目的,因此我采用了Mockito 。
因此,在過去的幾個(gè)月中,我一直在使用Mockito ,這是我對(duì)兩者的比較分析。
與我一起工作的人列舉了使用Mockitio的測(cè)試可讀性的原因,但是我對(duì)此有不同的看法。 假設(shè)我們要測(cè)試以下代碼: public class MyApp {MyService service;OtherService otherService;void operationOne() {service.operationOne();}void operationTwo(String args) {String operationTwo = otherService.operationTwo(args);otherService.operationThree(operationTwo);}void operationThree() {service.operationOne();otherService.operationThree("success");} }class MyService {void operationOne() {} }class OtherService {public String operationTwo(String args) {return args;}public void operationThree(String operationTwo) {} }現(xiàn)在,讓我使用EasyMock和Mockito為此類編寫一個(gè)簡(jiǎn)單的測(cè)試用例。
public class MyAppEasyMockTest {MyApp app;MyService service;OtherService otherService;@Beforepublic void initialize() {service = EasyMock.createMock(MyService.class);otherService = EasyMock.createMock(OtherService.class);app = new MyApp();app.service = service;app.otherService = otherService;}@Testpublic void verifySimpleCall() {service.operationOne();EasyMock.replay(service);app.operationOne();EasyMock.verify(service);}} public class MyAppMockitoTest {MyApp app;MyService service;OtherService otherService;@Beforepublic void initialize() {service = Mockito.mock(MyService.class);otherService = Mockito.mock(OtherService.class);app = new MyApp();app.service = service;app.otherService = otherService;}@Testpublic void verifySimpleCall() {app.operationOne();Mockito.verify(service).operationOne();}} 這是一個(gè)非常簡(jiǎn)單的測(cè)試,我必須說(shuō)Mockito更具可讀性。 但是根據(jù)經(jīng)典的測(cè)試方法,Mockito測(cè)試并不完整。 我們已經(jīng)驗(yàn)證了我們正在尋找的電話,但是如果明天我通過添加一個(gè)服務(wù)電話來(lái)更改源代碼,則測(cè)試不會(huì)中斷。 void operationOne() {service.operationOne();service.someOtherOp();} 現(xiàn)在,這使我感到測(cè)試不夠好。 但值得慶幸的是,Mockito提供了verifyNoMoreInteractions ,可用來(lái)完成測(cè)試。 現(xiàn)在,讓我為MyApp類編寫一些測(cè)試。 public class MyAppEasyMockTest {@Testpublic void verifyMultipleCalls() {String args = "one";EasyMock.expect(otherService.operationTwo(args)).andReturn(args);otherService.operationThree(args);EasyMock.replay(otherService);app.operationTwo(args);EasyMock.verify(otherService);}@Test(expected = RuntimeException.class)public void verifyException() {service.operationOne();EasyMock.expectLastCall().andThrow(new RuntimeException());EasyMock.replay(service);app.operationOne();}@Testpublic void captureArguments() {Capture<String> captured = new Capture<String>();service.operationOne();otherService.operationThree(EasyMock.capture(captured));EasyMock.replay(service, otherService);app.operationThree();EasyMock.verify(service, otherService);assertTrue(captured.getValue().contains("success"));}}public class MyAppMockitoTest {@Testpublic void verifyMultipleCalls() {String args = "one";Mockito.when(otherService.operationTwo(args)).thenReturn(args);app.operationTwo(args);Mockito.verify(otherService).operationTwo(args);Mockito.verify(otherService).operationThree(args);Mockito.verifyNoMoreInteractions(otherService);Mockito.verifyZeroInteractions(service);}@Test(expected = RuntimeException.class)public void verifyException() {Mockito.doThrow(new RuntimeException()).when(service).operationOne();app.operationOne();}@Testpublic void captureArguments() {app.operationThree();ArgumentCaptor capturedArgs = ArgumentCaptor.forClass(String.class);Mockito.verify(service).operationOne();Mockito.verify(otherService).operationThree(capturedArgs.capture());assertTrue(capturedArgs.getValue().contains("success"));Mockito.verifyNoMoreInteractions(service, otherService);} } 這些是一些實(shí)際的測(cè)試場(chǎng)景,我們想要聲明參數(shù),異常等。如果我查看并比較使用EasyMock編寫的測(cè)試和使用Mockito進(jìn)行的測(cè)試,我傾向于覺得這兩個(gè)測(cè)試在可讀性上都是相同的,但它們都沒有一個(gè)更好的任務(wù)。 EasyMock中大量的期望和返回調(diào)用使測(cè)試不可讀,并且Mockito的verify語(yǔ)句通常會(huì)影響測(cè)試的可讀性。 根據(jù)Mockito的書verifyZeroInteractions,verifyNoMoreInteractions不應(yīng)在您編寫的每個(gè)測(cè)試中使用,但是如果我將它們排除在測(cè)試范圍之外,則我的測(cè)試還不夠好。 此外,在測(cè)試中,所有事情都應(yīng)在開發(fā)人員的控制之下,即交互如何發(fā)生以及交互如何發(fā)生。 在EasyMock中,這方面更明顯,因?yàn)殚_發(fā)人員必須在他的代碼中放下所有這些交互,但是在Mockito中,框架負(fù)責(zé)所有交互,而開發(fā)人員只關(guān)心它們的驗(yàn)證(如果有)。 但是,這可能會(huì)導(dǎo)致測(cè)試場(chǎng)景,其中開發(fā)人員不受所有交互的控制。 Mockito具有像JunitRunner這樣的好東西,可用于創(chuàng)建具有所有必需依賴項(xiàng)的Mocks。 這是刪除一些基礎(chǔ)結(jié)構(gòu)代碼的好方法,并且EasyMock也應(yīng)該有一個(gè)。 @RunWith(MockitoJUnitRunner.class) public class MyAppMockitoTest {MyApp app;@MockMyService service;@MockOtherService otherService;@Beforepublic void initialize() {app = new MyApp();app.service = service;app.otherService = otherService;} } 結(jié)論: 由于我已經(jīng)使用了這兩個(gè)框架,因此我認(rèn)為,除了簡(jiǎn)單的測(cè)試用例之外,EasyMock和Mockito都導(dǎo)致可讀性相同的測(cè)試用例。 但是EasyMock對(duì)于單元測(cè)試更好,因?yàn)樗仁归_發(fā)人員控制事物。 由于其假設(shè)和考慮,Mockito將這種控制隱藏在地毯下,因此不是一個(gè)好選擇。 但是Mockito提供了某些非常有用的功能(例如junitRunner,調(diào)用鏈接),而EasyMock的下一個(gè)版本中應(yīng)該有一個(gè)。參考: 到目前為止 ,我們的JCG合作伙伴 Rahul Sharma 使用EasyMock或Mockito在The road…博客博客中。
翻譯自: https://www.javacodegeeks.com/2012/08/using-easymock-or-mockito.html
總結(jié)
以上是生活随笔為你收集整理的使用EasyMock或Mockito的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux c 编译器(linux c
- 下一篇: ddos如何获取隐秘信息(ddos如何获