Используйте Mockito / PowerMockito, чтобы издеваться над публичным методом суперкласса - PullRequest
0 голосов
/ 05 июня 2018

Есть ли в Mockito / PowerMockito какие-либо способы для насмешки над некоторыми методами суперкласса.

Ниже приведен сценарий, он выполняет многоуровневое наследование.

public class Network {
  public String getNetwork() {
    return "Technology";
  }
}

Вот еще один класс Technology который расширяет Network

public class Technology extends Network {
  public Type getTechnology() {
    String network = getNetwork();
    if(network == null){
      return null;
    }
    return network;
  }
}

Другой класс Service, расширяющий Technology

public class BaseService extends Technology {
  public void getServices() {
    Type type = getTechnology();
    if(type == null){
      throw new Exception('Type not found');
    }
  }
}

Я хочу написать тестовый пример для метода класса BaseService getServices, поэтомучто он должен выдать исключение, когда технологический класс Type равен нулю.

Я попытался выполнить несколько шагов, но не смог помочь.

Пример написанного теста

@Test
    public void test_get_services_should_throw__exception_when_type_is_null() throws Exception{

        //Arrange
        expectedException.expect(Exception.class);

        baseService = Mockito.mock(BaseService.class, Mockito.CALLS_REAL_METHODS);

        when(baseService.getTechnology()).thenReturn(null);


        //Act
        baseService.getServices();
    }

Приведенный выше фрагмент кода является всего лишь примером и может содержать ошибки.,Пожалуйста, игнорируйте, если таковые имеются.

Пожалуйста, помогите мне решить эту проблему.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Это должно работать.

@RunWith(MockitoJUnitRunner.class)
public class TestInheritance {

  @Spy
  BaseService baseService;

  @Rule
  public final ExpectedException expectedException = ExpectedException.none();

  @Test
  public void test_get_services_should_throw__exception_when_type_is_null() throws Exception{

    expectedException.expect(Exception.class);

    when(baseService.getTechnology()).thenReturn(null);

    baseService.getServices();
  }
}
0 голосов
/ 05 июня 2018

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

В вашем очень простом примере все null -проверкине имеет значения, так как вы всегда возвращаете постоянное непустое значение.В этом конкретном случае нет смысла насмехаться вообще.

Но, учитывая, что ваш базовый класс может фактически иметь разные возвращаемые значения.Вместо того, чтобы издеваться над методом родителя, вы должны написать свой тест таким образом, чтобы вы запускали альтернативные пути, изменяя предварительные условия «состояние» (состояние класса или глобальное состояние, например, среда) вашего класса.Этим вы создаете реальную ситуацию, когда родитель ведет себя иначе.

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

Нацеливание на строго изолированные модульные тесты может привести к тому, что наборы тестов не будут должным образом охватывать взаимодействие между классами.Строго изолированные тесты могут формировать основу вашего подхода к автоматизированному тестированию, но у вас должны быть тесты с некоторой степенью интеграции поверх этого (не говоря о «реальных» интеграционных тестах здесь, где вы интегрируетесь с внешними сервисами)).

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

0 голосов
/ 05 июня 2018

Используйте объект spy.Здесь baseService будет шпионом.

Вы можете добавить поведение к объекту spy так же, как и к mock 'ed.

Я дам вам небольшой старт -

baseService = Mockito.spy(new BaseService());

Кстати вы не увидите этой проблемы, если предпочтете композицию над наследованием .

...