Java 使用Powermockito 1.5避免列表元素上的强制转换字节码

Java 使用Powermockito 1.5避免列表元素上的强制转换字节码,java,unit-testing,mockito,powermock,Java,Unit Testing,Mockito,Powermock,我将powermock与mockito结合使用,因为我需要它的静态方法模拟功能。 我正在尝试将Powermock从1.4.9升级到1.5.6,并将mockito从1.9升级到1.9.5,因为在我的IDE中,1.4.9中的PowerMockRunner在特定条件下意外中断,问题在1.5版本中得到解决,而1.5版本又需要升级后者。 当我在单元测试中定义以下内容时 when(cart.getProducts().get(0)).thenReturn(productMock); ClassCastEx

我将powermock与mockito结合使用,因为我需要它的静态方法模拟功能。
我正在尝试将Powermock从1.4.9升级到1.5.6,并将mockito从1.9升级到1.9.5,因为在我的IDE中,1.4.9中的PowerMockRunner在特定条件下意外中断,问题在1.5版本中得到解决,而1.5版本又需要升级后者。
当我在单元测试中定义以下内容时

when(cart.getProducts().get(0)).thenReturn(productMock);
ClassCastException从存根类型引发为实际的列表元素类型<代码>购物车是一个深存根模拟。
在反编译字节码时,我注意到它尝试强制转换,如下面的示例所示

org/mockito/Mockito.when((com/shop/Product)cart.getProducts().get(0))
                   .thenReturn(productMock);
当反编译使用Powermock 1.4.12编译的相同代码时,我得到

org/mockito/Mockito.when(cart.getProducts().get(0))
                   .thenReturn(productMock);
没有尝试强制转换
获取(0)
结果。

它破坏了我的许多单元测试,我想知道是否有任何方法可以避免这种情况。

您必须分两步完成:

List<Product> products  = new ArrayList<>();
// add your product here with products.add()

when(cart.getProducts()).thenReturn(products);
List products=new ArrayList();
//将您的产品与products一起添加到此处。添加()
当(cart.getProducts())。然后返回(products);

您也可以模拟ArrayList,但这不是必需的。

Thx为您提供答案,但添加模拟产品或模拟列表几乎是同样的工作,我希望单元测试保持原样。我已经尝试模拟列表,但不满意,因为它将代表一个巨大的努力来更改整个代码以符合此要求。好的,但请注意,像这样的链式模拟是不正确的,并且不会适用于任何其他情况。同样,即使我的模拟返回深存根,模拟也不起作用?因为我介绍的案例似乎在代码中的许多单元测试中都有效。看起来它们真的很有效。实际上似乎是这样。你知道用PowerMockito 1.5+版本避免演员阵容的方法吗?