Это хорошая практика, чтобы издеваться над другим публичным методом в том же классе - PullRequest
0 голосов
/ 11 октября 2018

Например:

public class NumberService {

public boolean isNaturalNumber(int num) {
    return num > 0;
}

public String getClassificationInfo(int num) {
    return isNaturalNumber(num) ? num + "is a natural number" : num + "is not a natural number";
}
}

Вот два открытых метода, и метод getClassificationInfo называется методом isNaturalNumber.

Это хорошая практика для насмешки isNaturalNumberпри тестировании getClassificationInfo?

Вот так:

    @RunWith(MockitoJUnitRunner.class)
public class NumberServiceTest {

@Spy
private NumberService numberService;

@Test
public void test_getClassificationInfo_when_is_natural_number() {
    int num = generateInt();

    doReturn(true).when(numberService).isNaturalNumber(num);

    String classificationInfo = numberService.getClassificationInfo(num);

    assertThat(classificationInfo).isEqualTo(num + "is a natural number");
}

@Test
public void test_getClassificationInfo_when_is_not_natural_number() {
    int num = generateInt();

    doReturn(false).when(numberService).isNaturalNumber(num);

    String classificationInfo = numberService.getClassificationInfo(num);

    assertThat(classificationInfo).isEqualTo(num + "is not a natural number");
}

// the other test for isNaturalNumber

private int generateInt() {
    return new Random().nextInt();
}
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Нет. Это не очень хорошая практика, потому что мы должны имитировать заглушки, где задействован другой объект модуля / класса.

Например:

public class A{
   private B aObj;

   public void aDoingSomeBWork(){
      aObj.someMethod();
      someLogic();
  }
   private/public/any modifier void someLogic(){
     //some logic
   }
}

public class B{
   public void someMethod(){}
}

, тогда вы должны посмеяться над someMethod () B, ноне должен A's someLogic (), потому что вы тестируете модуль A в DoDoSomeBWork ().если вы издеваетесь над someLogic ();в модульном тестировании может быть случай, когда ваш код сломается.

0 голосов
/ 13 марта 2019

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

Однако в этом случае нет веских оснований для насмешки isNaturalNumber в тестах на getClassificationInfo:метод isNaturalNumber имеет детерминированное поведение и не приводит к недопустимо долгому времени выполнения.Также маловероятно, что вы много выиграете, симулируя случай, когда isNaturalNumber преднамеренно ведет себя неправильно в одном из тестов getClassificationInfo.

. Вам не нужно всецело насмехаться над всем.Например, вы также не высмеиваете стандартные математические функции библиотеки, такие как sin или cos, потому что они также не вызывают проблем в большинстве случаев.Насмешка должна быть сделана по причине.Поэтому, если вы подумываете над тем, чтобы использовать функцию или метод, вы должны знать, какую проблему вы собираетесь решить.Если проблема не решается, не издевайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...