У меня есть POJO, который использует услугу, чтобы сделать что-то:Использование Groovy метакласса перезаписать методы
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);
}
}
И у меня есть 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")
}
}
Первый метод испытания, testInjectedMockIFace
работы как и ожидалось: POJO создается с динамической реализацией IService
. Когда вызывается callX
, он просто возвращает «очень отличный». Таким образом, услуга издевается.
Однако я не понимаю, почему второй метод, testMetaClass
работает не так, как ожидалось, но вместо этого генерирует исключение NullPointerException при попытке вызвать callX
на объект службы. Я думал, что переписал doCallService
метод с этой линией:
pojo.metaClass.doCallService = { String s ->
Что я делаю не так?
Спасибо!
Одна вещь, о которой нужно помнить, это когда вы манипулируете метаклассом класса, каждый экземпляр с этой точки вперёд будет управляться. Это может оказать большое влияние на другие тесты, которые выполняются в одном сеансе. Когда вы манипулируете экземпляром класса, затрагивается только этот экземпляр. –