Могу ли я издеваться над file.mkdirs (), который находится внутри метода - PullRequest
0 голосов
/ 09 мая 2019

Вот мой старый код ниже.Я не хочу создавать фактическую папку.Вместо этого я хочу создать временную папку, которую необходимо удалить после завершения выполнения теста.

Public class MainClass() {
  public void m1() {
        m2();
  }

  private void m2() {
    File f=new File();
    f.mkrdirs()
  }
}

Вот мой TestClass

public class TestClass{
       @Rule
       public TemporaryFolder folder= new TemporaryFolder();

       public void testM1(){
            File fileSpy = mock(File.class);
            Mockito.doNothing().when(fileSpy.mkdir());

       }
}

, но не работает. Есть какие-нибудь подсказки?

1 Ответ

5 голосов
/ 09 мая 2019

Ваша проблема начинается здесь:

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 ().См. здесь , чтобы узнать, как это сделать.

...