Пропустить выполнение строки с помощью Mockito - PullRequest
1 голос
/ 05 апреля 2019

Я использую mockito для модульного тестирования и хочу пропустить строку.

// method I am testing
public String doSomeTask(String src, String dst) {
    // some code

    utils.createLink(src,dst);

    // some more code
} 


// utils class
public void createLink(String src, String dst) {
    // do something
    Path realSrc = "/tmp/" + src;
    Files.createSymbolicLink(realSrc, dst);

    // do something
}


// Test class

@Mock
private Utils utils;

@Test
public void testDoSomeTask() {
    // this does not seem to work, it is still executing the createLink method
    doNothing.when(utils).createLink(anyString(), anyString());
    myClass.doSomeTask(anyString(), anyString());
}

Теперь createLink - это метод void, и во время моего тестирования я не смог его создать, исключая причину AccessDenied для создания каталога.

Я хочу пропустить строку utils.createLink(src,dst); и перейти к следующим строкам.Есть ли способ, которым я могу сказать Мокито сделать это?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Предполагая, что переменная utils может быть установлена ​​с помощью установщика, вы можете следить за объектом класса Utils и переопределять его createLink() метод.

Основная идея:

Utils utils = new Utils();
Utils spyUtils = Mockito.spy(utils);
doNothing().when(spyUtils).createLink(any(String.class), any(String.class));

Теперь, установите этот spyUtils объект через сеттер.Каждый раз, когда вызывается createLink, он ничего не делает.

0 голосов
/ 05 апреля 2019

Вы можете смоделировать свой метод utils, чтобы он ничего не делал (с PowerMockito), или изменить свой код, чтобы метод utils не был статическим, и вы можете внедрить mock-экземпляр метода utils в объект, который вы тестируете, что-то вроде этого:

class ForTesting{

     UtilsClass utilsInstance;

      ForTesting (UtilsClass utilsInstance) {
        this.utilsInstance = utilsInstance;
      }

     // method you test
      public String doSomeTask(String src, String dst) {
         // some code
             utilsInstance.createLink(src, dst);
          // some more code
      } 
   }

 @Test
 public void test(){
     UtilsClass utilsInstance  = mock(UtilsClass.class);
     ForTesting classForTesting = new ForTesting(utilsInstance);
     assertEquals("yourValue",classForTesting.doSomeTask());

 }

Mocking с PowerMockito дает некоторые издержки, потому что вы не можете переопределить статические методы без наследования, поэтому некоторые собственные методы необходимы для изменения байт-кода во время выполнения.

...