Skip to content

Commit

Permalink
[SHIRO-772] Remove PowerMock from EnvironmentLoaderServiceTest.java.
Browse files Browse the repository at this point in the history
  - Enables building with JDK11 and 14
  - refactored ServiceLoader loading into separate method to enable mocking.
  • Loading branch information
bmarwell committed May 9, 2020
1 parent e225c10 commit 3f339f3
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,7 @@ private WebEnvironment webEnvironmentFromServiceLoader() {

WebEnvironment webEnvironment = null;
// try to load WebEnvironment as a service
ServiceLoader<WebEnvironment> serviceLoader = ServiceLoader.load(WebEnvironment.class);
Iterator<WebEnvironment> iterator = serviceLoader.iterator();
Iterator<WebEnvironment> iterator = doLoadWebEnvironmentsFromServiceLoader();

// Use the first one
if (iterator.hasNext()) {
Expand All @@ -223,6 +222,12 @@ private WebEnvironment webEnvironmentFromServiceLoader() {
return webEnvironment;
}

protected Iterator<WebEnvironment> doLoadWebEnvironmentsFromServiceLoader() {
ServiceLoader<WebEnvironment> serviceLoader = ServiceLoader.load(WebEnvironment.class);

return serviceLoader.iterator();
}

/**
* Returns the default WebEnvironment class, which is unless overridden: {@link IniWebEnvironment}.
* @return the default WebEnvironment class.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -39,85 +34,68 @@
/**
* 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<WebEnvironmentStub> 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));
}

@Test()
public void multipleServiceTest() throws Exception {

List<WebEnvironmentStub> environmentList = Arrays.asList(new WebEnvironmentStub(), new WebEnvironmentStub());
List<WebEnvironment> 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));
Expand Down
21 changes: 21 additions & 0 deletions web/src/test/resources/EmptyShiroIni.ini
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 3f339f3

Please sign in to comment.