mirror of
https://github.com/alibaba/testable-mock.git
synced 2025-01-10 20:30:11 +08:00
64 lines
1.9 KiB
Markdown
64 lines
1.9 KiB
Markdown
|
复用Mock类与方法
|
|||
|
---
|
|||
|
|
|||
|
Don't Repeat Yourself是软件开发过程当中的一项重要原则(即“DRY原则”),在编写测试代码时,有些通用的基础功能调用语句常常出现在许多相似的业务类里,若测试中需要Mock这些调用,就要在各个测试类中重复提供同样的Mock方法。而通过Mock方法的复用机制,能够很好的避免编写臃肿重复Mock代码的麻烦。
|
|||
|
|
|||
|
TestableMock支持两种粒度的Mock复用方式:<u>复用Mock类</u>和<u>复用Mock方法</u>。
|
|||
|
|
|||
|
## 复用Mock类
|
|||
|
|
|||
|
如果有两个或以上测试类需要Mock的方法近乎相同,那么采用类级别的Mock复用就是最省心的一种方式。
|
|||
|
|
|||
|
进行类级别的Mock复用,只需将Mock容器定义为独立的类,然后在要使用它的测试类上通过`@MockWith`进行引用。例如:
|
|||
|
|
|||
|
|
|||
|
```java
|
|||
|
@MockWith(ServiceMock.class)
|
|||
|
public class AaaServiceTest {
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
@MockWith(ServiceMock.class)
|
|||
|
public class BbbServiceTest {
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
public class ServiceMock {
|
|||
|
...
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
这样在`AaaServiceTest`和`BbbServiceTest`类中的测试用例在执行时,都会用`ServiceMock`容器类中定义的Mock方法进行调用匹配和Mock替换。
|
|||
|
|
|||
|
## 复用Mock方法
|
|||
|
|
|||
|
实际场景中,相比一次性复用整个Mock类的情况,更常见的是对部分高频Mock方法进行复用。
|
|||
|
|
|||
|
Mock方法的复用可以通过Mock容器类的继承来实现,父类中定义的所有Mock方法都会在子类中自然存在,例如:
|
|||
|
|
|||
|
```java
|
|||
|
public class AaaServiceTest {
|
|||
|
public static class Mock extends BasicMock {
|
|||
|
...
|
|||
|
}
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
public class BbbServiceTest {
|
|||
|
public static class Mock extends BasicMock {
|
|||
|
...
|
|||
|
}
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
public class BasicMock {
|
|||
|
@MockMethod(targetClass = UserDao.class)
|
|||
|
protected String getById(int id) {
|
|||
|
...
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
则名为`getById`的Mock方法在`AaaServiceTest`和`BbbServiceTest`的测试用例执行时都会生效。
|
|||
|
|