@Test
    void testProviderMethodPresence() {
        final ProxyConfigProvider proxyConfigProvider = new ProxyConfigProvider(new ProxyConfig());

        final Set<Class<?>> methodReturnClasses = Arrays.stream(ProxyConfigProvidersModule.class.getDeclaredMethods())
                .filter(method ->
                        !method.getName().endsWith(GenerateProxyConfigProvidersModule.THROWING_METHOD_SUFFIX))
                .map(Method::getReturnType)
                .filter(clazz ->
                        !SPECIAL_CASE_INTERFACE_CLASSES.contains(clazz))
                .collect(Collectors.toSet());

        final Set<Class<?>> notInjectableMethodReturnClasses = Arrays.stream(
                        ProxyConfigProvidersModule.class.getDeclaredMethods())
                .filter(method ->
                        method.getName().endsWith(GenerateProxyConfigProvidersModule.THROWING_METHOD_SUFFIX))
                .map(Method::getReturnType)
                .collect(Collectors.toSet());

        assertThat(methodReturnClasses)
                .doesNotContainAnyElementsOf(notInjectableMethodReturnClasses);

        final Set<Class<? extends AbstractConfig>> injectableConfigClasses = proxyConfigProvider.getInjectableClasses();

        assertThat(methodReturnClasses)
                .containsExactlyInAnyOrderElementsOf(injectableConfigClasses);

        assertThat(methodReturnClasses.containsAll(injectableConfigClasses))
                .withFailMessage(() -> {
                    final Set<Class<?>> unwantedMethods = new HashSet<>(methodReturnClasses);
                    unwantedMethods.removeAll(injectableConfigClasses);

                    return LogUtil.message(
                            "{} should contain an @Provides method for each injectable config class. " +
                            "Found the following unwanted method return types {}. " +
                            "injectableConfigClasses: {}, methodReturnClasses: {}. " +
                            "See {}.",
                            ProxyConfigProvidersModule.class.getSimpleName(),
                            unwantedMethods,
                            injectableConfigClasses.size(),
                            methodReturnClasses.size(),
                            GenerateProxyConfigProvidersModule.class.getSimpleName());
                })
                .isTrue();

        assertThat(injectableConfigClasses.containsAll(methodReturnClasses))
                .withFailMessage(() -> {
                    final Set<Class<?>> missingMethods = new HashSet<>(injectableConfigClasses);
                    missingMethods.removeAll(methodReturnClasses);

                    return LogUtil.message(
                            "{} should contain an @Provides method for each injectable config class. " +
                            "Found the following missing method return types {}. " +
                            "injectableConfigClasses: {}, methodReturnClasses: {}. " +
                            "See {}.",
                            ProxyConfigProvidersModule.class.getSimpleName(),
                            missingMethods,
                            injectableConfigClasses.size(),
                            methodReturnClasses.size(),
                            GenerateProxyConfigProvidersModule.class.getSimpleName());
                })
                .isTrue();
    }
If this fails you probably want to run {@link GenerateProxyConfigProvidersModule} to generate
the missing provider methods
stroom-proxy/stroom-proxy-app/src/test/java/stroom/proxy/app/guice/TestProxyConfigProvidersModule.java