Построить дерево с помощью hclust, ctree, rpart или некоторой другой функции [закрыто]

Кажется, вы не можете использовать метапрограммирование 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.

-11
задан Martijn Pieters 19 August 2013 в 09:03
поделиться