Кажется, вы не можете использовать метапрограммирование Groovy, чтобы заменить методы классов Java - даже публичные методы - попробуйте выполнить следующие действия в консоли Groovy:
ArrayList.metaClass.remove = { obj ->
throw new Exception('remove')
}
ArrayList.metaClass.remove2 = { obj ->
throw new Exception('remove2')
}
def a = new ArrayList()
a.add('it')
// returns true because the remove method defined by ArrayList is called,
// i.e. our attempt at replacing it above has no effect
assert a.remove('it')
// throws an Exception because ArrayList does not define a method named remove2,
// so the method we add above via the metaClass is invoked
a.remove2('it')
Если вы можете изменить исходный код из MyClass
я либо сделал бы doSomethingCrazyExpensive
защищенным, либо, желательно, реорганизовал его так, чтобы он был более дружественным к тестированию
public class MyClass {
private ClassOfSomeSort property1;
private ClassOfSomeOtherSort property2;
private CrazyExpensive crazyExpensive;
public MyClass(CrazyExpensive crazyExpensive) {
this.crazyExpensive = crazyExpensive;
}
public void init(){
property1 = new ClassOfSomeSort();
property2 = new ClassOfSomeOtherSort();
crazyExpensive.doSomethingCrazyExpensive();
}
}
public interface CrazyExpensive {
public void doSomethingCrazyExpensive();
}
После внесения изменений выше, при тестировании MyClass
вы можете легко создать экземпляр с помощью макета / заглушки CrazyExpensive
.