Ваша проблема начинается здесь:
File f=new File();
Ваш рабочий код вызывает new для класса файла.В своем тестовом коде вы делаете:
File fileSpy = mock(File.class);
И как этот шпион связан с вашим f
экземпляром?Ответ: совсем нет.
Объявление шпиона в вашем тесте волшебным образом не заставляет ваш производственный код использовать его!Поэтому вы должны убедиться, что когда ваш производственный код использует этот f
объект ... f
должен быть вашим fileSpy
Теперь у вас есть следующие опции:
- посмотрите, можете ли вы изменить свой рабочий код, чтобы вы могли каким-то образом передать экземпляр файла.Либо, выдвигая аргумент, что вы действительно можете что-то передать, либо превратив
f
в поле вашего класса, чтобы затем использовать аннотацию @InjectMock - от Mockito, если вы застряли в своем рабочем коде,Мокито не подойдет.Тогда вам нужен PowerMock (ito) или JMockit.
Как правило, я советую людям придерживаться простого Mockito и избегать насмешек new () (тем более насмешливых static вызовов)через PowerMock (ито) как чума.
Но тестирование унаследованного кода - это единственная ситуация, когда вам приходится выбирать между «вообще не тестировать» или «тестировать с PowerMock (ito)».Итак, если вы не можете изменить свой производственный код, тогда ваш единственный выбор - смоделировать этот вызов new ().См. здесь , чтобы узнать, как это сделать.