网站运营建设的培训免费建站网站号
web/
2025/10/9 13:54:09/
文章来源:
网站运营建设的培训,免费建站网站号,用什么框架做网站快,怎么样可以做自己的网站我大部分时间都在使用EasyMock #xff0c;但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一项目中使用两个框架来实现相同的目的#xff0c;因此我采用了Mockito 。 因此#xff0c;在过去的几个月中#xff0c;我一直在使用Mockito #xff0c;这是我… 我大部分时间都在使用EasyMock 但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一项目中使用两个框架来实现相同的目的因此我采用了Mockito 。 因此在过去的几个月中我一直在使用Mockito 这是我对两者的比较分析。 与我一起工作的人列举了使用Mockitio的测试可读性的原因但是我对此有不同的看法。 假设我们要测试以下代码 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) {}
} 现在让我使用EasyMock和Mockito为此类编写一个简单的测试用例。 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();}} 这是一个非常简单的测试我必须说Mockito更具可读性。 但是根据经典的测试方法Mockito测试并不完整。 我们已经验证了我们正在寻找的电话但是如果明天我通过添加一个服务电话来更改源代码则测试不会中断。 void operationOne() {service.operationOne();service.someOtherOp();} 现在这使我感到测试不够好。 但值得庆幸的是Mockito提供了verifyNoMoreInteractions 可用来完成测试。 现在让我为MyApp类编写一些测试。 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() {CaptureString captured new CaptureString();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);}
} 这些是一些实际的测试场景我们想要声明参数异常等。如果我查看并比较使用EasyMock编写的测试和使用Mockito进行的测试我倾向于觉得这两个测试在可读性上都是相同的但它们都没有一个更好的任务。 EasyMock中大量的期望和返回调用使测试不可读并且Mockito的verify语句通常会影响测试的可读性。 根据Mockito的书verifyZeroInteractionsverifyNoMoreInteractions不应在您编写的每个测试中使用但是如果我将它们排除在测试范围之外则我的测试还不够好。 此外在测试中所有事情都应在开发人员的控制之下即交互如何发生以及交互如何发生。 在EasyMock中这方面更明显因为开发人员必须在他的代码中放下所有这些交互但是在Mockito中框架负责所有交互而开发人员只关心它们的验证如果有。 但是这可能会导致测试场景其中开发人员不受所有交互的控制。 Mockito具有像JunitRunner这样的好东西可用于创建具有所有必需依赖项的Mocks。 这是删除一些基础结构代码的好方法并且EasyMock也应该有一个。 RunWith(MockitoJUnitRunner.class)
public class MyAppMockitoTest {MyApp app;MockMyService service;MockOtherService otherService;Beforepublic void initialize() {app new MyApp();app.service service;app.otherService otherService;}
} 结论 由于我已经使用了这两个框架因此我认为除了简单的测试用例之外EasyMock和Mockito都导致可读性相同的测试用例。 但是EasyMock对于单元测试更好因为它迫使开发人员控制事物。 由于其假设和考虑Mockito将这种控制隐藏在地毯下因此不是一个好选择。 但是Mockito提供了某些非常有用的功能例如junitRunner调用链接而EasyMock的下一个版本中应该有一个。 参考 到目前为止 我们的JCG合作伙伴 Rahul Sharma 使用EasyMock或Mockito在The road…博客博客中。 翻译自: https://www.javacodegeeks.com/2012/08/using-easymock-or-mockito.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89661.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!