2015-12-03 7 views
1

Я пишу некоторые тесты JUnit для устаревшего кода, и я большой поклонник использования аннотаций. Я хотел бы знать, можно ли создать объявление для объекта spied, а затем создать его экземпляр. Причина, по которой я спрашиваю, состоит в том, что у меня есть класс с конструктором с ненулевым значением. Значения для этого конструктора неизвестны только после установки тестовых примеров. Приведенный ниже код показывает, что я хотел бы сделать:Можно ли объявить, но не проинсталлировать Spied Object в Mockito, используя нотацию @Spy?

@RunWith(MockitoJUnitRunner.class) 
public class ObjectUndertestTest { 

    @Spy private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne; 
    private Integer parameterTwo; 

    @Before 
    public void setupTest() { 
     parameterOne = 1; 
     parameterTwo = 2; 
     someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo); 
    } 
} 

Единственный способ, который я могу видеть, чтобы быть в состоянии сделать это, чтобы смешивать мой синтаксис и использовать традиционный шпион (объект в макете) нотации. То есть:

@RunWith(MockitoJUnitRunner.class) 
public class ObjectUndertestTest { 

    private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne; 
    private Integer parameterTwo; 

    @Before 
    public void setupTest() { 
     parameterOne = 1; 
     parameterTwo = 2; 
     someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo); 
     SomeClassToSpy spySomeClassToSpy spy(someClassToSpy); 
    } 
} 

Или что-то подобное. Любые мысли по этому поводу?

ответ

0

берегись, @Spy не совсем документация аннотаций: Это инструкция для MockitoJUnitRunner (и др), чтобы инициализировать шпиона автоматически для вас в соответствии с документированными моделей использования. Хотя аннотации полезны и информативны, я думаю, что это может привести к недоумению использования имени для его имени, а не его семантики.

Тем не менее, если это просто вопрос построения экземпляра с выбранными аргументами конструктора, вы можете вызвать конструктор непосредственно и явно и использовать инициализацию Mockito, чтобы обернуть его в качестве шпиона (как в @Spy docs):

@Spy private SomeClassToSpy someClassToSpy = new SomeClassToSpy(1, 2); 

Хотя вы были бы правы в пользу методов @Before над инициализаторами классов или конструкторами, это явно документированный метод инициализации и вряд ли может вызвать проблемы с тестированием или проблемы с порядком инициализации.

+0

К сожалению, я хотел бы сделать ссылку на тип объекта, не создавая его до тех пор, пока не смогу проверить несколько входов. Это дает доступ к объекту в любом другом случае. После обширной игры, я обнаружил, что это невозможно сделать с аннотациями. Это требует реальной ссылки на объект, а затем с использованием ссылки spy (someClass). С абстрактным классом это было еще сложнее, но отлично работает в Mockito 1.10 –