@Override public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception { Method testMethod = context.getRequiredTestMethod(); DataProviderResolverContext resolverContext = getDataProviderResolverContext(context, sourceAnnotation); return findDataProviderMethods(resolverContext).stream().flatMap(dpm -> { DATAPROVIDER_ANNOTATION dataProviderAnnotation = dpm.getAnnotation(dataProviderAnnotationClass); boolean cacheDataProviderResult = cacheDataProviderResult(dataProviderAnnotation); Object data = invokeDataProviderMethodToRetrieveData(dpm, cacheDataProviderResult, context); return convertData(testMethod, data, getConverterContext(dataProviderAnnotation)); }); }
@Override protected Stream<TestTemplateInvocationContext> provideInvocationContexts(ExtensionContext context, TEST_ANNOTATION annotation) { Method testMethod = context.getRequiredTestMethod(); DataProviderResolverContext dataProviderResolverContext = getDataProviderResolverContext(context, annotation); List<Method> dataProviderMethods = findDataProviderMethods(dataProviderResolverContext); checkArgument(dataProviderMethods.size() > 0, String.format("Could not find a dataprovider for test '%s' using resolvers '%s'.", testMethod, dataProviderResolverContext.getResolverClasses())); return dataProviderMethods.stream().flatMap(dpm -> { DATAPROVIDER_ANNOTATION dataProviderAnnotation = dpm.getAnnotation(dataProviderAnnotationClass); boolean cacheDataProviderResult = cacheDataProviderResult(dataProviderAnnotation); Object data = invokeDataProviderMethodToRetrieveData(dpm, cacheDataProviderResult, context); return convertData(testMethod, data, getConverterContext(dataProviderAnnotation)) .map(d -> (TestTemplateInvocationContext) new DataProviderInvocationContext(testMethod, d, getDisplayNameContext(dataProviderAnnotation))); }); }
@Test public void testFindDataProviderMethodsShouldReturnEmptyListIfContextDoesNotContainAnyResolver() { // Given: when(context.getResolverClasses()) .thenReturn(Collections.<Class<? extends DataProviderMethodResolver>>emptyList()); // When: List<Method> result = DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: assertThat(result).isEmpty(); }
@Test public void testFindDataProviderMethodsShouldReturnEmptyListIfSingleResolverReturnsEmptyList() { // Given: @SuppressWarnings("unchecked") List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(TestResolver.class); when(context.getResolverClasses()).thenReturn(resolverClasses); TestResolver.methods = emptyList(); // When: List<Method> result = DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: assertThat(result).isEmpty(); assertThat(TestResolver.usedContexts).containsOnly(context); }
@Test public void testFindDataProviderMethodsShouldReturnFirstMatchEvenIfMutlipleResolverReturnNonEmptyList() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(TestResolver.class, TestResolver.class); when(context.getResolverClasses()).thenReturn(resolverClasses); when(context.getResolveStrategy()).thenReturn(ResolveStrategy.UNTIL_FIRST_MATCH); TestResolver.methods = emptyList(); // When: List<Method> result = DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: assertThat(result).isEmpty(); assertThat(TestResolver.usedContexts).containsOnly(context, context); }
@Test public void testFindDataProviderMethodsShouldThrowIllegalArgumentExceptionIfResolverClassHasNoDefaultConstructorExists() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(NoDefaultConstructor.class); when(context.getResolverClasses()).thenReturn(resolverClasses); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Could not find default constructor to instantiate"); // When: DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: expect exception }
@Test public void testFindDataProviderMethodsShouldReturnAllMatchesIfMutlipleResolverReturnNonEmptyList() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(TestResolver.class, TestResolver.class); final Method method = Methods.anyMethod(); when(context.getResolverClasses()).thenReturn(resolverClasses); when(context.getResolveStrategy()).thenReturn(ResolveStrategy.AGGREGATE_ALL_MATCHES); TestResolver.methods = asList(method); // When: List<Method> result = DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: assertThat(result).containsOnly(method, method); assertThat(TestResolver.usedContexts).containsOnly(context, context); }
@Test public void testFindDataProviderMethodsShouldReturnFirstMatchIfMutlipleResolverReturnNonEmptyList() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(TestResolver.class, TestResolver.class); final Method method = Methods.anyMethod(); when(context.getResolverClasses()).thenReturn(resolverClasses); when(context.getResolveStrategy()).thenReturn(ResolveStrategy.UNTIL_FIRST_MATCH); TestResolver.methods = asList(method); // When: List<Method> result = DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: assertThat(result).containsOnly(method); assertThat(TestResolver.usedContexts).containsOnly(context); }
@Test public void testFindDataProviderMethodsShouldThrowIllegalArgumentExceptionIfResolverClassesDefaultConstructorThrowsException() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(ExceptionInDefaultConstructor.class); when(context.getResolverClasses()).thenReturn(resolverClasses); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("default constructor of "); expectedException.expectMessage("has thrown an exception"); // When: DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: expect exception }
@Test public void testFindDataProviderMethodsShouldThrowIllegalArgumentExceptionIfResolverClassHasIsAbstract() { // Given: @SuppressWarnings("unchecked") final List<Class<? extends DataProviderMethodResolver>> resolverClasses = Arrays .<Class<? extends DataProviderMethodResolver>>asList(AbstractClass.class); when(context.getResolverClasses()).thenReturn(resolverClasses); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Could not instantiate"); expectedException.expectMessage("using default constructor"); // When: DataProviderMethodResolverHelper.findDataProviderMethods(context); // Then: expect exception }
@Test public void testFindDataProviderMethodsShouldThrowNullPointerExceptionIfContextIsNull() { // Given: expectedException.expect(NullPointerException.class); expectedException.expectMessage("'context' must not be null"); // When: DataProviderMethodResolverHelper.findDataProviderMethods(null); // Then: expect exception }