package de.is24.deadcode4j.analyzer; import de.is24.deadcode4j.AnalysisContext; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.annotation.Nonnull; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.atomic.AtomicBoolean; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @PrepareForTest(SAXParserFactory.class) @RunWith(PowerMockRunner.class) public class An_XmlAnalyzer extends AnAnalyzer<XmlAnalyzer> { private static final String XML_FILE = "de/is24/deadcode4j/analyzer/empty.xml"; private AtomicBoolean fileIsParsed; @Override protected XmlAnalyzer createAnalyzer() { fileIsParsed = new AtomicBoolean(false); return new XmlAnalyzer(".xml") { @Nonnull @Override protected DefaultHandler createHandlerFor(@Nonnull AnalysisContext analysisContext) { return new DefaultHandler() { @Override public void startDocument() throws SAXException { fileIsParsed.set(true); } }; } }; } @Test public void parsesMatchingFile() { analyzeFile(XML_FILE); assertTrue("Should have analyzed the XML file!", fileIsParsed.get()); } @Test public void doesNotParseNonMatchingFile() { objectUnderTest = new XmlAnalyzer(".foo") { @Nonnull @Override protected DefaultHandler createHandlerFor(@Nonnull AnalysisContext analysisContext) { Assert.fail("Should NOT have analyzed the XML file!"); return new DefaultHandler(); } }; analyzeFile(XML_FILE); } @Test public void handlesIOExceptionWhenAnalyzingFile() throws Exception { SAXParser saxMock = mock(SAXParser.class); doThrow(new IOException("JUnit")).when(saxMock).parse(Mockito.any(InputStream.class), Mockito.any(DefaultHandler.class)); SAXParserFactory saxFactoryMock = mock(SAXParserFactory.class); when(saxFactoryMock.newSAXParser()).thenReturn(saxMock); PowerMockito.mockStatic(SAXParserFactory.class); when(SAXParserFactory.newInstance()).thenReturn(saxFactoryMock); initAnalyzer(); try { analyzeFile(XML_FILE); fail("Should abort analysis!"); } catch (RuntimeException e) { assertThat(e.getMessage(), containsString(XML_FILE)); } } @Test(expected = RuntimeException.class) public void handlesSaxExceptionInConstructor() throws ParserConfigurationException, SAXException { SAXParserFactory saxFactoryMock = mock(SAXParserFactory.class); when(saxFactoryMock.newSAXParser()).thenThrow(new SAXException("JUnit")); PowerMockito.mockStatic(SAXParserFactory.class); when(SAXParserFactory.newInstance()).thenReturn(saxFactoryMock); initAnalyzer(); fail("Should not be able to construct XmlAnalyzer!"); } }