Cómo usar mockmvc para probar servicios REST en springMVC
¡Integrar simulacros en las pruebas de integración de Spring es increíble! Pero existen 3 condiciones para usarlo.
Junit debe tener la versión 4.9 o superior
Y tu framework debe ser spring mvc
Spring 3.2 o superior puede ser perfectamente compatible
Actualmente, muchas personas están usando Spring MVC para reemplazar struts2, ¡y la flexibilidad del Spring MVC es increíble! Entonces, ¡usa Spring MVC!
Anteriormente, los dos métodos siguientes se usaban generalmente para probar interfaces de acoplamiento (principalmente interfaces de servidor Java (generalmente: webService, restful)). El proceso de prueba se muestra en la figura:
1 ¿Usar directamente .collect.oatos.dto.status.RESTurl?
importar com.qycloud.oatos.server.service; PersonalDiskService;
// Este elemento debe usarse con junit 4.9 o superior.
?
@RunWith(SpringJUnit4ClassRunner.class) ?
clase pública PersonalDiskMockTests extiende AbstractContextControllerTests { ?
?
?
URI de cadena estática privada = RESTurl.searchPersonalFile;
MockMvc privado mockMvc ?
?
Cadena privada json = "{\"entId\; ":1234,\"userId\":1235,\"key\":\"new\"}"; ?
?
@Autowired ?
privado PersonalDiskService personalDiskService
@Before ?
public void setup() { ?
//this.mockMvc = webAppContextSetup(this.wac) .alwaysExpect(status().isOk()).build(); ?
this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build(); ?
}? /p>
@Test ?
public void readJson() lanza una excepción { ?
this.mockMvc.perform( ?
post(URI, "json").characterEncoding("UTF-8") ?
.contentType(MediaType.APPLICATION_JSON) ?
.content(json.getBytes()) ?
.andExpect(content().string("Leer desde JSON: JavaBean {foo=[bar], fruta=[manzana]}") ?
?
}?
Lo anterior es un ejemplo simple, que puede modificarse ligeramente para su uso real. Recuerde importar el paquete del frasco de prueba de resorte. No se requiere configuración adicional (¿no es muy conveniente?)
Por supuesto, si lo combina con junit's afirmar, el efecto será mejor. A continuación se muestran algunos ejemplos.
¿Código Java?
paquete com.qycloud.oatos.server.test.mockmvcTest;
importar organización estática. springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
importar java.io.UnsupportedEncodingException ?
importar java.lang.reflect.Field ? >
importar org.springframework.conlect.oatos.dto.status.CommConstants; ?
importar com.conlect.oatos.dto.status.ErrorType ?
importar com; .conlect.oatos.http.PojoMapper ?
clase pública MockUtil {
/**
* simulacro
* ?
* @param uri
* @param json
* @return
* @throws UnsupportedEncodingException
* @throws Exception
*/ ?
public static String mock(MockMvc mvc, String uri, String json)?
Lanza UnsupportedEncodingException, Exception { ?
¿Devolver mvc ?
.perform( ?
post(uri, "json").characterEncoding("UTF-8") ?
.contentType(MediaType.APPLICATION_JSON) ?
.content(json.getBytes()).andReturn() ?
.getResponse().getContentAsString() ? p>
}?
?
/**
* ?
* @param re valor de retorno
* @param object El objeto a convertir
* @param testName El objeto que se está probando actualmente
*/ ?
public static
System.out.println(re ?
if (ErrorType.error500.toString(); ). es igual(re)) { ?
System.out.println("----- Esta prueba de interfaz falló: -----" ?
+ testName) ; ?
falla(re);
} else if (CommConstants.OK_MARK.toString().equals(re)) { ?
System.out.println("----- Esta interfaz se ha realizado correctamente probado :-----" ?
+ testName); ?
}else{ ?
System.out.println("---- - re----- : "+re); ?
}?
if (object ! = null) { ?
if (re. contiene (":")){ ?
prueba { ?
T t = PojoMapper.fromJsonAsObject(re, objeto);
System.out; println ("----- Esta interfaz se ha probado con éxito:-----" ?
+ testName ?
} catch (Exception e) { ?
System.out.println("----- La prueba de interfaz falló:-----" ?
+ testName ?
fail( e.getMessage()); ?
}?
} ??
}
} ?? >
/**
* Inicializar información de versión.
Actualice la información de la versión primero antes de cada llamada para probar la fuerza
* @param mockMvc
* @param url
* @param fileId
* @param class1
* @return
* @throws UnsupportedEncodingException
* @throws Exception
*/ ?
public static
Long fileId, Class
?
String re = mock(mockMvc, url, fileId+""); ?
?
T dto = PojoMapper.fromJsonAsObject(re, class1); /p>
?
Versión larga = Long.parseLong(dto.getClass().getMethod("getVersion").invoke(dto).toString();
> System.out.println(" versión = "+versión ?
?
Devolver versión ?
?
}?
?
} ??
El uso es el siguiente:
¿Código Java?
@RunWith (SpringJUnit4ClassRunner.class)?
Clase pública PersonalDiskMockTests extiende AbstractContextControllerTests {
MockMvc privado MockMvc
EntId largo estático privado = 1234L; /p >
adminId largo estático privado = 1235L;
@Autowired ?
personalDiskService privado
@Before ?
configuración pública vacía() { ?
this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)?
.build() ?
}?
p>/***
*Pasar
*Búsqueda global de archivos empresariales
* ?
* @throws Excepción
*/ ?
@Test ?
public void searchPersonalFile() lanza Excepción {
SearchFileParamDTO sf = nuevo SearchFileParamDTO()
?
sf.setEntId(entId); ?
sf.setKey("li"); ?
sf.setUserId(adminId); /p>
String json = PojoMapper.toJson(sf); ?
String re = MockUtil.mock(this.mockMvc, RESTurl.searchPersonalFile, ?
json); ?
MockUtil.check(re, SearchPersonalFilesDTO.class, "searchPersonalFile");
}
} ?}}?
Por supuesto, dentro de @setup, @test se ejecutará una vez cada vez, por lo que puede colocar algunos parámetros de los que se debe crear una instancia cada vez
de la siguiente manera:
Código Java ?
@Autowired ?
ShareDiskService privado shareDiskService
@Before ?
configuración vacía pública() { ? p >
this.mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)?
.build() ?
prueba { ?
initDatas();
} catch (Excepción e) { ?
e.printStackTrace(); ?
}?
} ?? p>
?
private void initDatas() lanza UnsupportedEncodingException, excepción { ?
FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO.class); ?
File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO.class); ?
oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId, ShareFolderDTO .clase); ?
}?
¡vale! El uso básico es más o menos el mismo. No hay comentarios en el código, pero es simple y fácil de entender. Es hora de tirar algunos ladrillos y cemento. ¡Espero que todos puedan corregirme!