利用mock做service层单测

本文介绍了如何在不依赖外部资源(如数据库和网络)的情况下,进行Service层的单元测试。通过引入特定的Maven依赖,如JUnit,可以实现独立的业务层测试。文章提到了Mockito的设计原理,并提供了相关示例代码和参考资料,帮助读者理解和实践。

目标:不依赖外部(数据库,网络等),就能做业务层的单测。

只需要配上如下maven依赖(JUnit 4.0-4.3,其他版本的见官方文档):

<properties>
<powermock.version>1.6.3</powermock.version>
</properties>
<dependencies>

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-core</artifactId>

<version>1.10.19</version>

</dependency>

<dependency>
当需要 mock嵌套的 Service 时,我们可以使用 Mockito 的链式调用来逐 mock。 例如,假设有三个 ServiceServiceA、ServiceB 和 ServiceC。其中 ServiceA 调用了 ServiceB 的方法,而 ServiceB 又调用了 ServiceC 的方法。我们想要ServiceA 的一个方法,但是需要 mockServiceB 和 ServiceC 的方法。 代码示例: ``` public class ServiceA { private ServiceB serviceB; public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; } public void methodToTest() { // ... serviceB.methodInServiceB(); // ... } } public class ServiceB { private ServiceC serviceC; public ServiceB(ServiceC serviceC) { this.serviceC = serviceC; } public void methodInServiceB() { // ... serviceC.methodInServiceC(); // ... } } public class ServiceC { public void methodInServiceC() { // ... } } ``` 我们可以使用 Mockito 的链式调用来 mock ServiceB 和 ServiceC 的方法: ``` @Test public void testMethodInServiceA() { ServiceC mockedServiceC = mock(ServiceC.class); ServiceB mockedServiceB = mock(ServiceB.class); when(mockedServiceB.methodInServiceB()).thenAnswer(invocation -> { mockedServiceC.methodInServiceC(); return null; }); ServiceA serviceA = new ServiceA(mockedServiceB); serviceA.methodToTest(); // ... } ``` 在这个例子中,我们首先创建了 ServiceC 的 mock 对象 mockedServiceC 和 ServiceB 的 mock 对象 mockedServiceB。然后我们使用 when().thenAnswer() 的方式来 mock ServiceB 的 methodInServiceB() 方法,当该方法被调用时,我们先调用 mockedServiceC 的 methodInServiceC() 方法,然后返回 null。这样就可以 mockServiceB 和 ServiceC 的方法,同时ServiceA 的 methodToTest() 方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值