Поскольку вы хотите протестировать свою реализацию 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;
}
}