wordpress自媒体插件,涟源seo快速排名,广告平台网,wordpress文章倒序Springboot单元测试 - 依赖类mock测试
通常单元测试中#xff0c;我们会隔离依赖对于测试类的影响#xff0c;也就是假设所有依赖的一定会输出理想结果#xff0c;在测试中可以通过Mock方法来确保输出结果#xff0c;这也就引入另一个测试框架Mockito。
Mockito框架的作用…Springboot单元测试 - 依赖类mock测试
通常单元测试中我们会隔离依赖对于测试类的影响也就是假设所有依赖的一定会输出理想结果在测试中可以通过Mock方法来确保输出结果这也就引入另一个测试框架Mockito。
Mockito框架的作用就是模拟接口功能并不运行模拟接口的实际逻辑而是直接输出一个假定结果。
Mockito常见注释及方法
Mock被注释的对象会作为Mock对象InjectMocks被注释的对象依赖于Mock的对象通常是测试对象when(MockObject.method).thenReturn()对Mock的对象进行模拟输出doThrow(Exception).when(mockObject).Method对Mock的对象模拟抛出一个异常spy()也是建立一个模拟对象但可以待测试类 - AController
public class AController {AutowiredMongoService mongoService;public boolean testBean() {boolean res mongoService.testMethod2(4);return res;}}
依赖类 - MongoService
Service
public class MongoService {public void output() {System.out.println(This is a bean!!);}public boolean testMethod1(int num) {return num 0;}public boolean testMethod2(int num) {int val getVal();return val num;}private int getVal() {return 2;}
}
Mockito测试类 - RunWith需要运行MockitoJUnitRunner.class才能使用Mockito相关注解
方法1: 使用Mock更为简洁只需加入注解就可以mock对应成员变量 (该成员变量可以是非依赖注入)
RunWith(MockitoJUnitRunner.class)
public class MockTest {MockMongoService mongoService;InjectMocksAController aController;Testpublic void testMock1() {when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);Assert.assertEquals(aController.testBean(), true);}Test(expected Exception.class)public void testMock2() {doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());aController.testBean();}
}
方法2: 使用Mock函数
public class MockTest {MongoService mongoService;AController aController;BeforeEachpublic void init() {mongoService Mock(MongoService.class);aController new AController();/* 假设 AController class 中有setter用于加载mongoService */aController.setMongoService(mongoService);}Testpublic void testMock1() {when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);Assert.assertEquals(aController.testBean(), true);}Test(expected Exception.class)public void testMock2() {doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());aController.testBean();}
} Mock 和 Spy区别
上面两种注释都是建立一个模拟对象但是区别是Mock注释的对象是完全虚拟不能调用这个Mock对象的任何方法只能通过when().thenReturn() 来进行模拟输出但是Spy是建立一个真实的Mock对象可以调用对象中任何方法也可以模拟某些方法的输出。Spy大大增加了测试的自由度比如如果某个测试类你只想模拟某个方法但是想要某些方法的真实输出这是Spy就可以解决这个问题。
举例 - 模拟MongoService其中一个方法并测试另一个方法真实输出 SpyMongoService mongoServiceSpy;Testpublic void testSpy() {/** 模拟MongoService中 getVal并测试testMethod2*/when(mongoServiceSpy.getVal()).thenReturn(3);Assert.assertEquals(mongoServiceSpy.testMethod2(2), true);}
Reference
SpringBoot Test及注解详解 - codedot - 博客园单元测试之Mockito与PowerMock - 简书