@Test
    void testCrossPropValidation() {
        final Set<String> types = new HashSet<>(StreamTypeNames.ALL_HARD_CODED_STREAM_TYPE_NAMES);
        final Set<String> rawTypes = new HashSet<>(StreamTypeNames.ALL_HARD_CODED_RAW_STREAM_TYPE_NAMES);
        final Set<String> dataFormats = new HashSet<>(DataFormatNames.ALL_HARD_CODED_FORMAT_NAMES);
        // Add a raw type that is not in the set of types so should fail validation
        rawTypes.add("foo");
        MetaServiceConfig metaServiceConfig = new MetaServiceConfig(
                null,
                null,
                null,
                null,
                null,
                types,
                rawTypes,
                dataFormats,
                0);

        final Result<AbstractConfig> result = appConfigValidator.validate(metaServiceConfig);

        result.handleViolations((constraintViolation, validationSeverity) -> {
            switch (validationSeverity) {
                case ERROR -> LOGGER.error("Got violation: {}", constraintViolation.getMessage());
                case WARNING -> LOGGER.warn("Got violation: {}", constraintViolation.getMessage());
            }
        });
        Assertions.assertThat(result.getErrorCount())
                .isEqualTo(1);
    }
Test validation methods that are not bean props, i.e. cross prop validation
stroom-app/src/test/java/stroom/config/TestAppConfigValidator.java