Как создать тест для собственной реализации ParameterResolver? - PullRequest
0 голосов
/ 20 июня 2020

Я создал реализацию ParameterResolver, чтобы добавить параметр в мои методы тестирования. У меня есть сценарий, в котором создание объекта параметра может завершиться ошибкой без некоторых правильных параметров, определенных соответствующей аннотацией, и возникает исключение.

  @TestScenario(homeDirName = "")
  @Test
  void ensureFailingWithoutProperHomeDirectory(LauncherRuntime launcher) {

    assertThrows(MissingPropertiesException.class,
                 () -> launcher.run());
  }

Но этот тест не работает даже до запуска, ParameterResolutionException.

Я хотел бы знать, как его протестировать.

1 Ответ

1 голос
/ 20 июня 2020

Поскольку вы хотите протестировать свою реализацию ParameterResolver, а не механизм JUnit, точкой входа вашего модульного теста должен быть метод provideArguments вашей реализации. JUnit перехватывает каждое исключение, генерируемое этим методом, и добавляет его как причину для нового исключения ParameterResolutionException. Существует два возможных подхода:

A) Если ваша реализация должна вызывать несколько методов ExtensionContext, тогда имитируйте эти методы вместе с вашей аннотацией. И вызовите provideArguments своей реализации.

B) Если ваша реализация должна использовать ExtensionContext только для получения аннотации и ничего не делает с ней, что стоит проверить, затем переместите основные функции в собственный метод (например, accept(MyAnnotation)) и протестируйте этот метод. См., Например, здесь , как разработчики JUnit обращаются к этому для аннотации CVSSource.

Вот пример тестового примера для моей аннотации ResourceFilesArgumentsProvider / ResourceFilesSource:

import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

class ResourceFilesArgumentsProviderTest {

  @Test
  public void nonExistingDirectory() throws Exception {

    ResourceFilesSource annotation = resourceFiles("/non-existing-dir");

    AnnotatedElement annotatedElement = mock(AnnotatedElement.class);

    when(annotatedElement.getAnnotation(ResourceFilesSource.class))
      .thenReturn(annotation);

    ExtensionContext context = mock(ExtensionContext.class);
    when(context.getElement()).thenReturn(Optional.of(annotatedElement));
    when(context.getTestClass()).thenReturn(Optional.of(getClass()));

    assertThrows(NoSuchFileException.class, () -> provideArguments(context));
  }

  private Stream<Object[]> provideArguments(ExtensionContext context) throws Exception {
    ResourceFilesArgumentsProvider provider = new ResourceFilesArgumentsProvider();
    return provider.provideArguments(context).map(Arguments::get);
  }

  private ResourceFilesSource resourceFiles(String directory) {

    /* mock the annotation with Mockito, or alternatively create
     * an anonymous class with new ResourceFileSource() { ... }
     */
    ResourceFilesSource annotation = mock(ResourceFilesSource.class);
    when(annotation.directory()).thenReturn(directory);
    return annotation;
  }

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