tengo un POJO que utiliza un servicio de hacer algo:Usando maravilloso MetaClass sobrescribir métodos
public class PlainOldJavaObject {
private IService service;
public String publicMethod(String x) {
return doCallService(x);
}
public String doCallService(String x) {
if(service == null) {
throw new RuntimeException("Service must not be null");
}
return service.callX(x);
}
public interface IService {
String callX(Object o);
}
}
Y tengo un caso de prueba maravillosa:
class GTest extends GroovyTestCase {
def testInjectedMockIFace() {
def pojo = new PlainOldJavaObject(service: { callX: "very groovy" } as IService)
assert "very groovy" == pojo.publicMethod("arg")
}
def testMetaClass() {
def pojo = new PlainOldJavaObject()
pojo.metaClass.doCallService = { String s ->
"no service"
}
assert "no service" == pojo.publicMethod("arg")
}
}
El primer método de ensayo, testInjectedMockIFace
obras como se esperaba: POJO se crea con una implementación dinámica de IService
. Cuando se invoca callX
, simplemente devuelve "muy groovy". De esta manera, el servicio es burlado.
Sin embargo, no entiendo por qué el segundo método, testMetaClass
no funciona como se esperaba, sino que arroja una NullPointerException al intentar invocar callX
en el objeto de servicio. Pensé que había sobrescrito el método doCallService
con esta línea:
pojo.metaClass.doCallService = { String s ->
¿Qué estoy haciendo mal?
Gracias!
Una cosa a tener en cuenta aquí es cuando manipulas la clase metaClass, cada instancia desde ese punto en adelante será manipulada. Esto puede tener un gran impacto en otras pruebas que se ejecutan en la misma sesión. Cuando manipulas una instancia de una clase, solo esa instancia se ve afectada. –