@Test public void testTemplateLocatorReaderIsAlwaysClosed() { final String template = "FOO"; final String illegalTemplate = "{{foo"; final AtomicBoolean isCloseInvoked = new AtomicBoolean(false); TemplateLocator locator = new AbstractTemplateLocator(1) { @SuppressWarnings("resource") @Override public Reader locate(String templateId) { return "foo".equals(templateId) ? new MyStringReader(template, isCloseInvoked) : new MyStringReader(illegalTemplate, isCloseInvoked); } @Override public Set<String> getAllIdentifiers() { return null; } }; final MustacheEngine engine = MustacheEngineBuilder.newBuilder().addTemplateLocator(locator).build(); assertEquals(template, engine.getMustacheSource("foo")); assertTrue(isCloseInvoked.get()); engine.invalidateTemplateCache(); isCloseInvoked.set(false); assertFalse(isCloseInvoked.get()); assertEquals(template, engine.getMustache("foo").render(null)); assertTrue(isCloseInvoked.get()); isCloseInvoked.set(false); assertFalse(isCloseInvoked.get()); ExceptionAssert.expect(MustacheException.class) .check( new Runnable() { public void run() { engine.getMustache("whatever").render(null); } }); assertTrue(isCloseInvoked.get()); }