1 package com.google.inject.servlet; 2 3 import static org.easymock.EasyMock.createMock; 4 5 import com.google.inject.Guice; 6 import com.google.inject.Scopes; 7 import com.google.inject.Singleton; 8 import javax.servlet.FilterConfig; 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import junit.framework.TestCase; 12 13 /** 14 * Ensures that an error is thrown if a Servlet or Filter is bound under any scope other than 15 * singleton, explicitly. 16 * 17 * @author dhanji@gmail.com 18 */ 19 public class InvalidScopeBindingTest extends TestCase { 20 21 @Override tearDown()22 protected void tearDown() throws Exception { 23 GuiceFilter.reset(); 24 } 25 testServletInNonSingletonScopeThrowsServletException()26 public final void testServletInNonSingletonScopeThrowsServletException() { 27 GuiceFilter guiceFilter = new GuiceFilter(); 28 29 Guice.createInjector( 30 new ServletModule() { 31 @Override 32 protected void configureServlets() { 33 serve("/*").with(MyNonSingletonServlet.class); 34 } 35 }); 36 37 ServletException se = null; 38 try { 39 guiceFilter.init(createMock(FilterConfig.class)); 40 } catch (ServletException e) { 41 se = e; 42 } finally { 43 assertNotNull("Servlet exception was not thrown with wrong scope binding", se); 44 } 45 } 46 testFilterInNonSingletonScopeThrowsServletException()47 public final void testFilterInNonSingletonScopeThrowsServletException() { 48 GuiceFilter guiceFilter = new GuiceFilter(); 49 50 Guice.createInjector( 51 new ServletModule() { 52 @Override 53 protected void configureServlets() { 54 filter("/*").through(MyNonSingletonFilter.class); 55 } 56 }); 57 58 ServletException se = null; 59 try { 60 guiceFilter.init(createMock(FilterConfig.class)); 61 } catch (ServletException e) { 62 se = e; 63 } finally { 64 assertNotNull("Servlet exception was not thrown with wrong scope binding", se); 65 } 66 } 67 testHappyCaseFilter()68 public final void testHappyCaseFilter() { 69 GuiceFilter guiceFilter = new GuiceFilter(); 70 71 Guice.createInjector( 72 new ServletModule() { 73 @Override 74 protected void configureServlets() { 75 // Annotated scoping variant. 76 filter("/*").through(MySingletonFilter.class); 77 78 // Explicit scoping variant. 79 bind(DummyFilterImpl.class).in(Scopes.SINGLETON); 80 filter("/*").through(DummyFilterImpl.class); 81 } 82 }); 83 84 ServletException se = null; 85 try { 86 guiceFilter.init(createMock(FilterConfig.class)); 87 } catch (ServletException e) { 88 se = e; 89 } finally { 90 assertNull("Servlet exception was thrown with correct scope binding", se); 91 } 92 } 93 94 @RequestScoped 95 public static class MyNonSingletonServlet extends HttpServlet {} 96 97 @SessionScoped 98 public static class MyNonSingletonFilter extends DummyFilterImpl {} 99 100 @Singleton 101 public static class MySingletonFilter extends DummyFilterImpl {} 102 } 103