Есть ли способ поделиться кодом @Before между классами набора тестов? - PullRequest
0 голосов
/ 31 октября 2019

Я тестирую плагин Cordova в Java / Android, и мне нужно инициализировать свой класс плагинов и установить какое-либо состояние перед запуском тестов.

  @Before
  public void beforeEach() throws Exception {
    System.out.println("Creating new Instance ");

    PowerMockito.mockStatic(Helpers.class);
    PowerMockito.when(Helpers.canUseStorage(any(), any())).thenReturn(true);

    MyLogger myLoggerMock = PowerMockito.mock(MyLogger.class);
    PowerMockito.doNothing().when(myLoggerMock, "log", anyString());

    PowerMockito.whenNew(MyLogger.class).withAnyArguments().thenReturn(myLoggerMock);

    this.sut = spy(new FilePicker());
    PowerMockito.doNothing().when(this.sut).pick(any(), any());
  }

Я хочу создать Test Suite / Java Classна публичную функцию, но я не хочу повторять этот код каждый раз.

Есть ли способ поделиться , что перед каждым между тестовыми наборами? Я нашел ClassRule , но я думаю, что я не делаю то, что мне нужно (или я неправильно понимаю ... Я действительно новичок в Java)

В Typescript мы можем поделиться beforeEach функции с несколькими наборами, и каждый из них может иметь свои beforeEach

1 Ответ

1 голос
/ 01 ноября 2019

Одним из возможных способов является использование наследования:

Заставить все тестовые классы расширяться из одного «родительского тестового» класса и определить @Before в родительском классе. Поэтому он будет вызываться автоматически для всех подклассов:

     public class ParentTest {

         @Before
         public void doInitialization() {
          ....
         }
     }

     public class Test1Class extends ParentClass {

         @Test
         public void fooTest() {
          // doInitialization will be executed before this method
         }

         @Test  
         public void barTest() {
           // doInitialization will be executed before this method as well
         }
     }

Два примечания:

Примечание 1

В коде, который вы используете sut (испытуемый объект) - это, очевидно, не должно быть в методе doInitialization родителя, поэтому возможно, что Test1Class также будет иметь методы, помеченные @Before (см. здесь для получения информации о порядке ии так далее) Затем `sut инициализируется с помощью Spy, что, честно говоря, странно, ИМХО, тестируемый субъект должен быть реальным классом, который вы написали, но это выходит за рамки вопроса, просто упомянув его, потому что он может указывать на ошибку.

Примечание 2

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

Хотя этот подход работает в целом, вы должны быть очень осторожны с PowerMockito. Я не эксперт по PowerMockito и стараюсь избегать такого рода пародий в моем коде, но в двух словах, способ, которым он манипулирует байтовым кодом, может конфликтовать с другими инструментами. Из вашего кода: вы можете сделать рефакторинг HelperUtils нестатичным и, таким образом, избежать PowerMocking в пользу регулярного моделирования, которое быстрее и намного безопаснее. Что касается ведения журнала - обычно вы можете пойти на компромисс с ним в модульном тесте, если вы используете библиотеку slf4j, вы можете настроить его на использование журнала «no-op» для тестов, таких как отправка всех сообщений регистрации в «ничто», а не-видеть их в консоли.

...