Ho un POJO che utilizza un servizio di fare qualcosa:Utilizzando Groovy metaclasse sovrascrivere Metodi
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);
}
}
E ho un banco di prova Groovy:
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")
}
}
Il primo metodo di prova, testInjectedMockIFace
opere come previsto: il POJO viene creato con un'implementazione dinamica di IService
. Quando viene invocato callX
, restituisce semplicemente "molto groovy". In questo modo, il servizio viene deriso.
Tuttavia, non capisco perché il secondo metodo, testMetaClass
non funzioni come previsto, ma lancia una NullPointerException quando si tenta di richiamare callX
sull'oggetto servizio. Pensavo di aver sovrascritto il metodo doCallService
con questa linea:
pojo.metaClass.doCallService = { String s ->
Che cosa sto facendo di sbagliato?
Grazie!
Una cosa da tenere a mente qui è quando si manipola la metaClass della classe, ogni istanza da quel punto in avanti verrà manipolata. Questo può avere un grande impatto su altri test eseguiti nella stessa sessione. Quando si manipola un'istanza di una classe, viene interessata solo quell'istanza. –