### Question:
ServiceLocator { public Set<MarkupLanguage> getAllMarkupLanguages() { final Set<MarkupLanguage> markupLanguages = new HashSet<MarkupLanguage>(); loadMarkupLanguages(new MarkupLanguageVisitor() { public boolean accept(MarkupLanguage language) { markupLanguages.add(language); return true; } }); return filterDuplicates(markupLanguages); } protected  ServiceLocator(ClassLoader classLoader); static ServiceLocator getInstance(ClassLoader classLoader); static ServiceLocator getInstance(); MarkupLanguage getMarkupLanguage(final String languageName); Set<MarkupLanguage> getAllMarkupLanguages(); static void setImplementation(Class<? extends ServiceLocator> implementationClass);  }### Answer:
@Test public void testLoadClassNotFound() throws MalformedURLException { final URL url = new URL("file: final AtomicBoolean wasThrown = new AtomicBoolean(); locator = new ServiceLocator(ServiceLocatorTest.class.getClassLoader()) { @Override protected Class<?> loadClass(ResourceDescriptor resource, String className) throws ClassNotFoundException { wasThrown.set(true); throw new ClassNotFoundException(className); } @Override protected List<ResourceDescriptor> discoverServiceResources() { return Collections.singletonList(new ResourceDescriptor(url)); } @Override protected List<String> readServiceClassNames(URL url) { return Collections.singletonList("test.TestLanguage"); } @Override void logFailure(String className, Exception e) { } }; Set<MarkupLanguage> languages = locator.getAllMarkupLanguages(); assertTrue(wasThrown.get()); assertNotNull(languages); assertTrue(languages.isEmpty()); }
@Test public void getAllMarkupLanguagesFiltersDuplicates() { final MarkupLanguage language1 = new TestMarkupLanguage("Language 1"); final MarkupLanguage language1b = new MarkupLanguage() { { setName("Language 1"); } @Override public void processContent(MarkupParser parser, String markupContent, boolean asDocument) { throw new IllegalStateException(); } }; final MarkupLanguage language2 = new TestMarkupLanguage("Language 3"); final MarkupLanguage language2b = new TestMarkupLanguage("Language 3"); ServiceLocator locator = new ServiceLocator(ServiceLocatorTest.class.getClassLoader()) { @Override void loadMarkupLanguages(MarkupLanguageVisitor visitor) { visitor.accept(language1); visitor.accept(language1b); visitor.accept(language2); visitor.accept(language2b); } }; Set<MarkupLanguage> markupLanguages = locator.getAllMarkupLanguages(); assertEquals(3, markupLanguages.size()); assertTrue(markupLanguages.containsAll(ImmutableSet.of(language1, language1b))); assertTrue(markupLanguages.contains(language2) || markupLanguages.contains(language2b)); }