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