StackedModuleConfigRepository implements ModuleConfigRepository { @Override public Optional<ModuleConfig> getModuleConfig(String name) { ModuleConfig stackedConfig = null; for (ModuleConfigRepository repository : repositories) { Optional<ModuleConfig> config = repository.getModuleConfig(name); if (config.isPresent()) { if (stackedConfig == null) { stackedConfig = config.get(); } else { stackedConfig = new StackedModuleConfig(stackedConfig, config.get()); } } } return Optional.ofNullable(stackedConfig); } StackedModuleConfigRepository(ModuleConfigRepository... repositories);  StackedModuleConfigRepository(List<ModuleConfigRepository> repositories); @Override boolean moduleExists(String name); @Override Optional<ModuleConfig> getModuleConfig(String name);  }
@Test public void test() { StackedModuleConfigRepository stackedRepository = new StackedModuleConfigRepository(createRepository2(), createRepository1()); ModuleConfig config1 = stackedRepository.getModuleConfig("config1").orElse(null); assertNotNull(config1); assertEquals("newValue1", config1.getStringProperty("key1")); assertEquals("value2", config1.getStringProperty("key2")); }