Можно ли объявить, но не инсталировать объект Spied в Mockito, используя нотацию @Spy?

Я пишу некоторые тесты JUnit для унаследованного кода, и я большой поклонник использования аннотаций. Я хотел бы знать, возможно ли создать объявление для объекта шпиона, а затем создать его экземпляр. Я спрашиваю, потому что у меня есть класс с ненулевым конструктором. Значения этого конструктора неизвестны до тех пор, пока не будут настроены тестовые случаи. Код ниже показывает, что я хотел бы сделать:

@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);
    }
}

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

1 ответ

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

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

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

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

Другие вопросы по тегам