【发布时间】:2014-09-10 15:43:46
【问题描述】:
我想单元测试一个带有签名的方法
public oracle.sql.ARRAY methodA(java.sql.Connection connection)
连接对象被模拟使用
Mockito.mock(Connection.class)
并在测试时传递给methodA。
oracle.sql.ARRAY 有一个构造函数
new ARRAY(oracle.sql.ArrayDescriptor, Connection, Object)
methodA 具有获取 ArrayDescriptor 的逻辑。 它还具有为此构造函数提供第三个参数的逻辑,但它以对象数组的形式提供它
我正在模拟这两组逻辑并传递一个模拟的 ArrayDescriptor 对象和一个模拟的 Object 数组。 所有这些模拟都能正常工作。
所以我的构造函数调用就像
new ARRAY(arrayDescriptorMock, connectionMock, objectMock)
此构造函数调用在作为测试的一部分执行时会引发异常
java.lang.ClassCastException:$java.sql.Connection$$EnhancerByMockitoWithCGLIB$$2427854e 无法转换为 oracle.jdbc.OracleConnection
为了避免这个错误,我做了很多尝试来模拟这个构造函数调用。然而,每一个都被证明是徒劳的。我正在为构造函数记录我的模拟代码
尝试1
PowerMockito.whenNew(ARRAY.class).withParameterTypes(ArrayDescriptor.class, Connection.class, Object.class)
.withArguments(any(ArrayDescriptor.class), any(Connection.class), any(Object[].class))
.thenReturn(expectedArray);
尝试2
PowerMockito.whenNew(ARRAY.class).withArguments(arrayDescriptorMock,connectionMock,objectArrayMock).thenReturn(expectedArray);
传说: arrayDescriptorMock: ArrayDescriptor 的模拟
connectionMock:连接模拟
objectArrayMock:对象数组的mock,模拟代码为
Object[] structArrayMock = new Object[2];
STRUCT obj1 = mock(STRUCT.class);
STRUCT obj2 = mock(STRUCT.class);
structArrayMock[0] = obj1;
structArrayMock[1] = obj2;
注意事项: 被测方法有以下我没有模拟的代码
Object[] objArray = new Object[2];
我正在使用 PowerMockito、Mockito 和 TestNG。但是,我认为这个问题与TestNG无关,因此JUNIT标签应该没问题。
请告知为什么会出现这个 ClassCastException 以及如何避免它?
编辑 我也相信 Mockito 应该拦截构造函数调用。这意味着它不应该允许执行真正的构造函数。假设简单地返回 ARRAY 类的模拟对象。为什么这不会发生?为什么要尝试 Casting ?
【问题讨论】:
标签: junit testng mockito powermock