Насмешка над отдельной функцией класса из класса, который тестируется - PullRequest
1 голос
/ 07 января 2020

У меня есть функция, которая вызывает метод из другого класса. Этот класс и метод были протестированы и используют реальные данные, что делает мой тест несовместимым с ожидаемыми значениями, которые я жестко запрограммировал.

public class MyClass{
  public void functionToBeTested(String params){
    //stuff to do
    Caller call = new Caller();
    callResult = call.post(someJSON);
    //do stuff with callResult
  }
}

Вот джунит:

public class TestMyClass{
  MyClass testClass = new MyClass();
  Caller mock;

  @Before
  public void setup(){
  premadeAnswer = new String(file);
  mock = Mockito.mock(Caller.class);
  Mockito.when(mock.post(Mockito.any())).thenReturn(premadeAnswer);
  }

  @Test
  public void studentFees_CorrectSSN(){
    assertEquals(expected.getThing(), testClass.functionToBeTested("PARAMS").getThing());
  }
}

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

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Это не сработает, потому что Caller не вводится в функцию functionToBeTested.

 Mockito.when(mock.post(Mockito.any())).thenReturn(premadeAnswer);

это когда оператор работает только для вашего смоделированного экземпляра, внутри functionToBeTested вы создаете новый экземпляр Caller.

. Измените functionToBeTested(String params) на functionToBeTested(String params, Caller call). а затем передайте имитированный Caller экземпляр или попробуйте насмешливый Caller конструктор.

Подробнее о втором подходе здесь

0 голосов
/ 07 января 2020

Я заметил в вашем первом блоке кода, которым вы поделились, что не указано возвращаемое значение. Я добавил void в блок кода ниже.

public class MyClass{
  public void functionToBeTested(String params){
    //stuff to do
    Caller call = new Caller();
    callResult = call.post(someJSON);
    //do stuff with callResult
  }
}
...