У меня есть POJO, который использует сервис, чтобы сделать что-то:
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 ->
Что я делаю не так?
Спасибо!