博客搬家,原 blog:https://blog.csdn.net/chensanwa/article/details/105881067
1. 扯犊子
话不多说,单元测试,知道的卅?
mock 数据? 也懂的卅?
好,上菜!!!
2. 一个字,干
业务逻辑说明: MockitoService 调用 MockitoDao, 需要对 service 进行测试
待测试代码:
MockitoService.java
@Service
public class MockitoService {
@Autowired
private MockitoDao mockitoDao;
public String getData() {
String data = mockitoDao.getData();
return "service:" + data;
}
}
复制代码
MockitoDao.java
@Component
public class MockitoDao {
/**
* 获取数据
* @return
*/
public String getData() {
// 具体实现不重要,反正都会 mock
return "data";
}
}
复制代码
3. Mockito 闪亮登场
3.1. 引入依赖
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
复制代码
3.2. 测试代码
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
/**
* Mockito 提供的 Runner
*
* 如果不使用 MockitoJUnitRunner 而采用 Spring Runner,
* 则需要添加 MockitoAnnotations.initMocks(this) 启用 Mockito 注解
*/
// Mockito 提供的 Runner
@RunWith(MockitoJUnitRunner.class)
public class MockitoServiceTest {
// 注入 mock 对象,允许内部依赖 mock
@InjectMocks
MockitoService mockitoService;
// mock 对象
@Mock
MockitoDao mockitoDao;
@Before
public void mockData() {
// MockitoAnnotations.initMocks(this);
// mock 行为
Mockito.when(mockitoDao.getData()).thenReturn("mockito");
}
@Test
public void getData() {
String data = mockitoService.getData();
Assert.assertEquals("service:mockito", data);
}
}
复制代码
3.4. 为啥是真正的单元测试
单元测试,顾名思义,咱们应该仅仅、只对某一块单元进行测试,最好是方法级别,顶多是类级别的测试。
如果超过了此规模,就不应该是单元测试的活了。 比如多个类之间的测试,应该交给 集成测试
来干。而不是,单元测试。
Mockito 通过提供 Runner 测试环境,通过 mock 掉类中依赖的其他资源(其他类、数据、第三方资源等),实现真正的单元测试。
并且,有着 Junit 4 的背书,perfect !!!
更多 Mockito 文档请骑上你可爱的小摩托,https://github.com/xhiteam/mockito-doc-zh
4. 参考
完整代码: https://github.com/LamboChen/demo/tree/master/mock
评论