对于我们java开发者来说,提到单元测试都会说Junit。确实,Junit是我们用的最多的测试库,但是Junit在面对某些情况的时候,会有点不好搞。比如,你的方法里有依赖外部服务,比如rpc的远程调用,api服务的返回等。而Junit我们更关注结果的返回,而mockito呢,则更多的是在mock数据方面。
今天我们下面简单介绍下mockito
首先我们在pom中引入mockito
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.27.0</version> <scope>test</scope> </dependency>
如果想要配合Junit用的话,需要加入以下的配置
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>2.27.0</version> <scope>test</scope> </dependency>
下面我们来看具体的方法如何使用mockito
看以下代码
@ExtendWith(MockitoExtension.class) class MockitoServiceImplTest { @InjectMocks MockitoServiceImpl mockService; @Mock AServiceImpl aService; }
- @ExtendWith 用来初始化一个Mock容器
- @InjectMocks 即创建一个实例,比如说上面代码的MockitoServiceImpl 他是一个service类,我们针对这个service进行测试,那么我们用@InjectMocks 创建一个实例,这样呢,我们就不需要初始化一个spring的context,这样也就移除了@Autowird
- @Mock 创建一个依赖的mock对象,比如下文我要在mockService用到aService,那么给aService加上@Mock注解
好了 下面我们进入具体的业务来
比如说我有以下的一个业务,然后我该怎么mock呢
@Service public class MockitoServiceImpl{ @Autowired private StudentDao studentDao; @Autowired private CheckService checkService; @Override public bool update(Student student){ Student student = studentDao.findOne(student.getName()); bool result = checkService.check(student.Id); if (result == false){ return } try { bool result = StudentDao.update(student); return result; } catch (Exception e) { throw new RuntimeException("更新失败", e); } } }
我们来看mockito如何来做
@RunWith(MockitoJUnitRunner.class) public class MockTest{ @InjectMocks private MockitoServiceImpl mockServiceImpl; @Mock private StudentDao studentDao; @Mock private CheckService checkService; @Test public void testInjectMocks() { Student student = new Student //设置方法的预期返回值 when(studentDao.findOne("admin")).thenReturn(student); //跳过上面的check方法 //行为测试 断言的时候不会执行 verify(checkService, never()).check(anyInt()); //test method bool updateResult = mockServiceImpl.update(student) // 校验结果 assertEquals(updateResult, true); } }
以上就是一个简单的mockito的使用