2013-04-03 3 views
1

У меня есть abstract класс, который я хотел бы, чтобы дразнить из для тестирования:createMock и не абстрактные методы в абстрактном классе

public abstract class Foo { 
    public abstract void bar(); 
    public void baz() { 
     System.out.print("Hi from baz!"); 
    } 
} 

Если я использую EasyMock Foo mock = createNiceMock(Foo.class), а затем вызвать mock.baz() я получаю java.lang.NullPointerException , Если я изменю baz() на final, все будет работать плавно (я предполагаю, что это связано с тем, что EasyMock не может издеваться над методами final), но я хотел был бы иметь возможность позвонить baz(), не делая этого.

Есть ли способ создать макет объекта с помощью EasyMock, который позволяет мне называть мои методы не abstract?

Один обходной путь настоящее время я использую это:

Foo mock = new Foo() { 
    @Override 
    public void bar() { 
     return; 
    } 
} 

но это супер некрасиво.

ответ

0

Так что я нашел решение своего вопроса. Вы можете создавать частичные издевается в EasyMock:

Foo mock = EasyMock.createMockBuilder(Foo.class) 
       .addMockedMethod("bar") 
       .createNiceMock(); 

Одно предостережение к этому является то, что если класс имеет переменные экземпляра, так как вы не используете new они не будут инициализированы! Если у кого есть обходной путь для этого аспекта, это было бы полезно. Это создает частичный для этого класса:

public abstract class Foo { 
    public double myInstanceVariable = 2; 
    public abstract void bar(); 
    public void baz() { 
     System.out.print("Hi from baz!"); 
    } 
} 

Где это можно назвать mock.myInstanceVariable и получить 2.

+0

Что касается вашего обходного пути, вы можете просто установить поле ... Поле поля = Foo.class.getDeclaredField (fieldName); \t \t field.setAccessible (true); \t \t field.set (setFieldOn, value); –

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