diff --git a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java index 4d334e7d1..c263e38df 100644 --- a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java +++ b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java @@ -202,8 +202,7 @@ private WebEnvironment webEnvironmentFromServiceLoader() { WebEnvironment webEnvironment = null; // try to load WebEnvironment as a service - ServiceLoader serviceLoader = ServiceLoader.load(WebEnvironment.class); - Iterator iterator = serviceLoader.iterator(); + Iterator iterator = doLoadWebEnvironmentsFromServiceLoader(); // Use the first one if (iterator.hasNext()) { @@ -223,6 +222,12 @@ private WebEnvironment webEnvironmentFromServiceLoader() { return webEnvironment; } + protected Iterator doLoadWebEnvironmentsFromServiceLoader() { + ServiceLoader serviceLoader = ServiceLoader.load(WebEnvironment.class); + + return serviceLoader.iterator(); + } + /** * Returns the default WebEnvironment class, which is unless overridden: {@link IniWebEnvironment}. * @return the default WebEnvironment class. diff --git a/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java b/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java index 1c1f97570..18ce9afd6 100644 --- a/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java +++ b/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java @@ -22,15 +22,10 @@ import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.easymock.PowerMock; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import javax.servlet.ServletContext; import java.util.Arrays; import java.util.List; -import java.util.ServiceLoader; import static org.easymock.EasyMock.expect; import static org.hamcrest.Matchers.*; @@ -39,36 +34,25 @@ /** * Tests for {@link EnvironmentLoader} that depend on PowerMock the stub out a ServiceLoader. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(EnvironmentLoader.class) public class EnvironmentLoaderServiceTest { @Test() public void singleServiceTest() throws Exception { - List environmentList = Arrays.asList(new WebEnvironmentStub()); - ServletContext servletContext = EasyMock.mock(ServletContext.class); expect(servletContext.getInitParameter("shiroEnvironmentClass")).andReturn(null); expect(servletContext.getInitParameter("shiroConfigLocations")).andReturn(null); - - PowerMock.mockStaticPartialStrict(ServiceLoader.class, "load"); - - final ServiceLoader serviceLoader = PowerMock.createMock(ServiceLoader.class); - - EasyMock.expect(ServiceLoader.load(WebEnvironment.class)).andReturn(serviceLoader); - EasyMock.expect(serviceLoader.iterator()).andReturn(environmentList.iterator()); + expect(servletContext.getResourceAsStream("/WEB-INF/shiro.ini")).andReturn( + getClass().getResourceAsStream("/EmptyShiroIni.ini")); EasyMock.replay(servletContext); - PowerMock.replayAll(); WebEnvironment resultEnvironment = new EnvironmentLoader().createEnvironment(servletContext); - PowerMock.verifyAll(); EasyMock.verify(servletContext); - assertThat(resultEnvironment, instanceOf(WebEnvironmentStub.class)); - WebEnvironmentStub environmentStub = (WebEnvironmentStub) resultEnvironment; + assertThat(resultEnvironment, instanceOf(IniWebEnvironment.class)); + IniWebEnvironment environmentStub = (IniWebEnvironment) resultEnvironment; assertThat(environmentStub.getServletContext(), sameInstance(servletContext)); } @@ -76,48 +60,42 @@ public void singleServiceTest() throws Exception { @Test() public void multipleServiceTest() throws Exception { - List environmentList = Arrays.asList(new WebEnvironmentStub(), new WebEnvironmentStub()); + List environmentList = Arrays.asList(new WebEnvironmentStub(), new WebEnvironmentStub()); ServletContext servletContext = EasyMock.mock(ServletContext.class); - expect(servletContext.getInitParameter("shiroEnvironmentClass")).andReturn(null); - - PowerMock.mockStaticPartialStrict(ServiceLoader.class, "load"); - - final ServiceLoader serviceLoader = PowerMock.createMock(ServiceLoader.class); - - EasyMock.expect(ServiceLoader.load(WebEnvironment.class)).andReturn(serviceLoader); - EasyMock.expect(serviceLoader.iterator()).andReturn(environmentList.iterator()); + expect(servletContext.getInitParameter(EnvironmentLoader.ENVIRONMENT_CLASS_PARAM)).andReturn(null); EasyMock.replay(servletContext); - PowerMock.replayAll(); + + final EnvironmentLoader environmentLoader = EasyMock.createMockBuilder(EnvironmentLoader.class) + .addMockedMethod("doLoadWebEnvironmentsFromServiceLoader") + .createMock(); + EasyMock.expect(environmentLoader.doLoadWebEnvironmentsFromServiceLoader()).andReturn(environmentList.iterator()); + EasyMock.replay(environmentLoader); try { - new EnvironmentLoader().createEnvironment(servletContext); + environmentLoader.createEnvironment(servletContext); Assert.fail("Expected ConfigurationException to be thrown"); } catch (ConfigurationException e) { assertThat(e.getMessage(), stringContainsInOrder("zero or exactly one", "shiroEnvironmentClass")); } - PowerMock.verifyAll(); EasyMock.verify(servletContext); + EasyMock.verify(environmentLoader); } @Test() public void loadFromInitParamTest() throws Exception { ServletContext servletContext = EasyMock.mock(ServletContext.class); - expect(servletContext.getInitParameter("shiroEnvironmentClass")).andReturn(WebEnvironmentStub.class.getName()); + expect(servletContext.getInitParameter(EnvironmentLoader.ENVIRONMENT_CLASS_PARAM)).andReturn(WebEnvironmentStub.class.getName()); expect(servletContext.getInitParameter("shiroConfigLocations")).andReturn(null); - PowerMock.mockStaticPartialStrict(ServiceLoader.class, "load"); - EasyMock.replay(servletContext); - PowerMock.replayAll(); WebEnvironment resultEnvironment = new EnvironmentLoader().createEnvironment(servletContext); - PowerMock.verifyAll(); EasyMock.verify(servletContext); assertThat(resultEnvironment, instanceOf(WebEnvironmentStub.class)); diff --git a/web/src/test/resources/EmptyShiroIni.ini b/web/src/test/resources/EmptyShiroIni.ini new file mode 100644 index 000000000..c5ee1af60 --- /dev/null +++ b/web/src/test/resources/EmptyShiroIni.ini @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +[main] + +[urls] +/* = anon