Можно ли объявить, но не инсталировать объект 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 над инициализаторами классов или конструкторами, это явно документированный метод инициализации, который вряд ли вызовет загрязнение теста или проблемы порядка инициализации.