/*
* Copyright 2008 the original author or authors.
*
* Licensed 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.
*/
package samples.interfacemethodfinding;
import org.easymock.EasyMock;
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 org.powermock.reflect.internal.WhiteboxImpl;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
* There was a bug in PowerMock 1.2 and its predecessors that made PowerMock
* {@link WhiteboxImpl#getMethod(Class, Class...)} fail when invoking proxified
* interface methods declared in extended interfaces. E.g. if interface A
* extends B & C and a method was declared in B it wouldn't be found by
* {@link WhiteboxImpl#getMethod(Class, Class...)} since it only used to
* traverse the class hierarchy and not the structure of the extended
* interfaces. This was fixed in version 1.3 and this test demonstrates that
* it's solved.
* <p>
* Thanks to Lokesh Vaddi for finding this bug and to provide an example.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest( { InterfaceMethodHierarchyUsage.class, WsUtil.class })
public class InterfaceMethodHierarchyUsageTest {
private InterfaceMethodHierarchyUsage myClass;
@Test
public void assertMethodsAreFoundInInterfaceHierarchy() throws Exception {
Connection mockConnection = PowerMock.createMock(Connection.class);
PowerMock.mockStaticPartial(WsUtil.class, "getConnection");
PreparedStatement mockPrepared = PowerMock.createMock(PreparedStatement.class);
EasyMock.expect(WsUtil.getConnection()).andReturn(mockConnection);
EasyMock.expect(mockConnection.prepareStatement("select * from emp")).andReturn(mockPrepared);
mockConnection.close();
EasyMock.expectLastCall();
mockPrepared.close();
EasyMock.expectLastCall();
PowerMock.replayAll();
myClass = new InterfaceMethodHierarchyUsage();
myClass.usePreparedStatement();
PowerMock.verifyAll();
}
}