2009-08-20 6 views
2

У меня есть заводской метод, который создает объекты, которые будут использоваться в модульных тестах. Эти объекты все вытекают из того же базового класса:В Java я могу создать экземпляр анонимного подкласса объекта класса?

public static <T extends BaseEntity> T modMake(Class<T> clazz) 
{ 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } catch (IllegalAccessException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } 
} 

Теперь я хочу, чтобы переопределить метод получения из этого базового класса, но только для испытаний. Я обычно делаю это с анонимным классом, например (Node является одним из subtaypes из BaseEntity):

public static Node nodMake() 
{ 
    return new Node() { 
     @Override 
     public long ixGet() { return 1; } 
    }; 
} 

Могу ли я сделать это в функции, используя Class аргумент тоже?

ответ

3

Потеряйте свой заводской метод и используйте насмешливый API, например EasyMock, чтобы достичь описанного вами поведения.

Ваш код будет в конечном итоге что-то вроде этого:

long returnValue = 12; 

Node nodeMock = createMock(Node.class); 
expect(nodeMock.ixGet()).andReturn(returnValue); 
replay(nodeMock); 

//add test code here 

verify(nodeMock); 

Чтобы ответить на вопрос Hanno о том, как это работает:

Это зависит от вашего издевается ли интерфейс или класс.

Корпус интерфейса прост (по коду), он использует так называемый динамический прокси-сервер, который является частью ядра Java.

В случае класс он выполняет манипуляции с байт-кодом, которые @Jonathan упоминает в своем ответе, только за хорошим API.

Оба вышеупомянутых механизма позволяют перехватывать метод и EasyMock просто отвечает на основании ожидаемых вами ожиданий.

+0

Интересно. Я еще не использовал Java, как это. –

+0

Теперь я использую EasyMock, и это потрясает. Благодаря! –

0

Я не думаю, что есть какой-либо способ сделать это. Вам, вероятно, нужно заглянуть в манипуляторы байт-кода, если вам действительно нужно пройти этот маршрут. Javassist и BCEL - это пара вариантов.

Смежные вопросы