json - org - install spring security grails
¿Cómo pruebo un servicio de Grails que usa un convertidor? (5)
Aunque está probando un servicio, puede aplicar la @TestMixin(ControllerUnitTestMixin)
a su clase de prueba para que Grails configure el convertidor JSON.
Tengo un servicio de Grails que envía correos electrónicos usando un servicio externo haciendo una llamada HTTP:
class EmailService {
def sendEmail(values) {
def valueJson = values as JSON
... // does HTTP call to 3rd party service
}
}
He escrito una prueba unitaria para probar este servicio (porque una prueba de integración activa Hibernate y todo el framework de dominio, que no necesito):
@TestFor(EmailService)
class EmailServiceTests {
void testEmailServiceWorks() {
def values = [test: ''test'', test2: ''test2'']
service.sendEmail(values)
}
}
Sin embargo, cuando ejecuto esta prueba unitaria, falla con esta excepción cuando intenta hacer la conversión as JSON
:
org.apache.commons.lang.UnhandledException: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Unconvertable Objeto de clase: java.util.LinkedHashMap
Luego volví a escribir mi prueba de unidad para hacer lo siguiente:
void testEmailServiceWorks() {
def value = [test: ''test'', test2: ''test2'']
def valueJson = value as JSON
}
Y recibo la misma excepción cuando intenta hacer la conversión as JSON
.
¿Alguien sabe por qué estoy recibiendo esta excepción y cómo puedo solucionarlo?
Como el plugin Grails 3.3.x grails-test-mixins
está en desuso. @ver la guía de migración .
Para este problema, debe implementar GrailsWebUnitTest
que proviene de Grails Testing Support Framework .
La magia como JSON se crea cuando el marco de dominio se activa.
Debe cambiar su prueba a una de integración o simular el tipo asType.
def setUp(){
java.util.LinkedHashMap.metaClass.asType = { Class c ->
new grails.converters."$c"(delegate)
}
}
Rember para limpiar después de ti mismo en el tearDown, no querrías fugas de metaprogramación en tu banco de pruebas.
def tearDown(){
java.util.LinkedHashMap.metaClass.asType = null
}
Editar: si vienes del futuro, considera esta respuesta: https://.com/a/15485593/194932
Obtuve el mismo error al intentar probar la unidad de un controlador que llama "render myMap como JSON". Usamos Grails 1.3.7 y ninguna de las otras soluciones funcionó para mí sin introducir otros problemas. La actualización de Grails no era una alternativa para nosotros en este momento.
Mi solución fue usar JSONBuilder en lugar de "como JSON", así:
render(contentType: "application/json", {myMap})
Ver http://docs.grails.org/latest/guide/theWebLayer.html#moreOnJSONBuilder
(Me doy cuenta de que esto es antiguo, pero vine aquí en busca de una solución, y otros lo hicieron)
puede inicializar el JSON en el setUp (). Hay varios dispositivos de referencia que implementan ObjectMarshaller, que deben agregarse a la configuración del convertidor para que funcione la conversión de JSON.
ejemplo:
DefaultConverterConfiguration<JSON> defaultConverterConfig = new DefaultConverterConfiguration<JSON>()
defaultConverterConfig.registerObjectMarshaller(new CollectionMarshaller())
defaultConverterConfig.registerObjectMarshaller(new MapMarshaller())
defaultConverterConfig.registerObjectMarshaller(new GenericJavaBeanMarshaller())
ConvertersConfigurationHolder.setTheadLocalConverterConfiguration(JSON.class, defaultConverterConfig);