依赖:
SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了
org.springframework.boot
spring-boot-starter-test
test
(1)@RunWith 指定运行环境,例:
@RunWith(SpringRunner.class) Junit运行Spring的测试环境
@RunWith(MockitoJUnitRunner.class) Junit运行Mockito的运行环境,不会加载springboot上下文
@SpringBootTest 加载springboot上下文配置
(注意: @RunWith(MockitoJUnitRunner.class) 不能和 @RunWith(SpringRunner.class) 同时使用,而一般都需要 @RunWith(SpringRunner.class) 提供spring容器环境,所以很少用这个注解)
(2)@Mock 用于模拟一个服务,例如:
测试的时候需用调用B服务,但是B服务没写 好,这是可以先Mock一个B服务
(3)@InjectMocks 标注服务的实现类
创建一个实例,其余用@Mock注解创建的mock将被注入到用该实例中
(4)@Before 每个测试方法执行前,执行一次
(5)@After 每个测试方法执行完,执行一次
(6)@Test 标注测试方法
(7)@MockBean : mock对应引入的bean
如果一个mock对象中需要注入其它mock对象,比如要mock UserService,UserService 依赖于另一个mock对象orderService,这时就不能直接对 UserSiervice 使用 @Mock 直接的注解,需要:
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
@SpringBootTest
@RunWith(SpringRunner.class)
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class) //step1
public class RuleRpcServiceTest extends KdAbstractJUnit4SpringContextTests {
@Mock
private OrderService orderService;
//step2
@InjectMocks
@Resource
private UserServiceImpl userService;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
}
when…then:
Long userId = 10L;
//thenReturn 返回指定数据
when(userService.findById(userId)).thenReturn(new User(userId, null));
//触发上面mock定义的thenReturn
User user1 = userService.findById(userId);
System.out.println(user1);
//thenCallRealMethod 调用mock类原本的方法
when(userService.findById(userId)).thenCallRealMethod();
do…when:
doReturn(new User(userId, null)).when(userService).findById(userId);
doCallRealMethod().when(userService).findById(userId);
doThrow(new RuntimeException("xxx不合法")).when(userService).findById(userId);
构建各类HTTP Request请求的工厂方法
(2)MockHttpServletRequestBuilder
构建Request的缺省builder
功能描述: 用来执行
结果信息Handler
访问Http请求的结果信息
提取请求结果信息的各类断言
其中Matcher类为org.hamcrest包中的类。
(8)StatusResultMatchers
检查结果中的各类信息
参考:springBoot项目使用Mock单元测试Controller层 - 知乎
接口demo:
@GetMapping("/xx/listXxx/{param}")
public ResultSet> listXxx(@PathVariable("param") String param){
//查询逻辑
List xxList = new ArrayList<>();
return ResultSet.success(xxList);
}
单元测试:
@Test
public void testListXxx() throws Exception {
//请求的url地址
String url = "/xx/listXxx/{param}";
//构造Request,param=123456
mvc.perform(MockMvcRequestBuilders.get(url, "123456")
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json("{'code':'200'}"))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}