Mockito单元测试

 Mockito是一个很不错的框架,可以mock,诸如远程调用的结果,redis的结果,数据库的结果等。

说下重点:

一、

@InjectMocks
@Autowired

这两个注解。放在调用的方法之上,本类中是controller,

 

我们需要mock的bean,在上面注解@MockBean,这样Mockito框架,就会mock该bean,然后在后面通过when方法。替换掉,bean对应的方法返回结果。就ok了。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import java.util.HashMap;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class AuthenticateControllerTest extends BaseTest {

    @InjectMocks
    @Autowired
    private AuthenticateController authenticateController;

    @MockBean
    private IDBaseServer idBaseServer;
    @MockBean
    private RedissonClient redissonClient;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(authenticateController).build();
    }

    @Test
    public void authenticate() throws Exception {
        mockAuthnByPassword();
        mockGetIdentityInfoById();
        AuthnRequest authnRequest = new AuthnRequest();
        authnRequest.setAuthnType("pwd");
        authnRequest.setUsername("张三1");
        authnRequest.setPassword("123456");
        authnRequest.setVerificationCode("1234");
        //设置值
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
        String requestJson = ow.writeValueAsString(authnRequest);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/v5/authenticate")
                .header("traceId","1")
                .header("tenantId","2")
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .content(requestJson))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        System.out.println(mvcResult.getResponse().getContentAsString());
    }




    @Test
    public void createSession() throws Exception {
        mockRedissonClient();
        CreateSessionRequest createSessionRequest = new CreateSessionRequest();
        createSessionRequest.setServiceId("ServiceId");
        createSessionRequest.setPrincipal(new PrincipalDto());
        AuthnResult result = new AuthnResult();
        result.setSuccesses(new HashMap<>());
        createSessionRequest.setAuthnResult(result);
        //设置值
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
        String requestJson = ow.writeValueAsString(createSessionRequest);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/v5/session")
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .content(requestJson))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        System.out.println(mvcResult.getResponse().getContentAsString());
    }

    private void mockRedissonClient() {
        RMapCache mapCache =  Mockito.mock(RMapCache.class);
        when(redissonClient.getMapCache(Constant.AUTHN_SESSION_PREFIX)).thenReturn(mapCache);
    }

    private void mockAuthnByPassword() {
        RestResult<IdentityInfo> result = new RestResult<>();
        IdentityInfo identityInfo = new IdentityInfo();
        identityInfo.setId(1000L);
        result.setResult(identityInfo);
        when(idBaseServer.authnByPassword(anyString(),anyString())).thenReturn(result);
    }

    private void mockGetIdentityInfoById() {
        RestResult<IdentityInfo> result = new RestResult<>();
        IdentityInfo identityInfo = new IdentityInfo();
        identityInfo.setId(1000L);
        identityInfo.setCategory(1);
        identityInfo.setCountry("Country");
        identityInfo.setDisplayName("DisplayName");
        identityInfo.setDisplayPy("DisplayPy");
        identityInfo.setEmail("Email");
        identityInfo.setMobile("Mobile");
        identityInfo.setPosition("Position");
        identityInfo.setSex(1);
        identityInfo.setShowOrder(1);
        identityInfo.setStatus(1);
        identityInfo.setTitle("Title");
        identityInfo.setUserName("UserName");
        identityInfo.setUserNo("UserNo");
        identityInfo.setUserSaname("UserSaname");
        result.setResult(identityInfo);
        when(idBaseServer.getIdentityInfoById(anyString())).thenReturn(result);
    }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值