Mockito单元测试详解

一、常用注解

依赖:

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对象,比如要mock UserService,UserService 依赖于另一个mock对象orderService,这时就不能直接对 UserSiervice 使用 @Mock 直接的注解,需要:

  • 测试类上加 @TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
  • 标注 @InjectMocks + @Autowired之类的注入注解
@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和do…when用法

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);

四、controller单元测试

(1)、MockMvcRequestBuilders

构建各类HTTP Request请求的工厂方法

  • get(urltemplate, vars)
  • post(urltemplate, vars)
  • delete(urltemplate, vars)
  • put(urltemplate, vars)

(2)MockHttpServletRequestBuilder

构建Request的缺省builder

  • cookie(Cookie… cookie): 设置信息
  • content(String str): 请求内容
  • contentType(): 设置contentType类型
  • param(String name, String … value): 设置参数
  • session()
  • requestAttr()
  • flashAttr()
  • locale()
  • accept(): 接手内容类型MediaType

(3)ResultMatcher


功能描述: 用来执行

  • match(MvcResult result): void     针对执行结果进行断言判断
  • matchAll(ResultMatcher… matchers) : ResultMatcher    执行断言,批量执行


(4)ResultHandler


结果信息Handler

  • void handle(MvcResult result) : 处理结果信息


(5)ResultActions

  • andExpect(ResultMatcher var1) : ResultActions   对返回的Result结果进行断言, 返回为ResultActions,运行流式风格调用
  • andDo(ResultHandler handler): ResultActions   添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。返回对象为ResultActions
  • andReturn() : MvcResult   表示执行完成后返回相应的结果,其结果为MvcResult


(6)MvcResult


访问Http请求的结果信息

  • getRequest()
  • getResponse()
  • getHandler()
  • getModelAndView()


(7)MockMvcResultMatchers


提取请求结果信息的各类断言

  • status(): StatusResultMatchers 得到响应状态验证器
  • content(): 内容
  • header(): 头信息,比如验证处理器类型/方法名
  • model(): 模型信息
  • flash(): Flash attribute
  • forwardedUrl():  验证处理完请求后转发的url(绝对匹配)
  • redirectedUrl()
  • cookie()
  • jsonPath(String expression, Matcher matcher) 得到Json表达式验证器
  • jsonPath(String expression, Object… args)
  • xpath(String expression, Object… args)
  • xpath(String expression, Matcher matcher)

其中Matcher类为org.hamcrest包中的类。

(8)StatusResultMatchers
检查结果中的各类信息

  • isBadRequest(): 不合法的请求
  • isOk(): 200

参考: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();
    }

你可能感兴趣的:(Java,单元测试,junit,java)