加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Mockito ClassCastException

发布时间:2020-12-14 16:45:27 所属栏目:Java 来源:网络整理
导读:我想测试的方法有一个for循环与bList中的每个元素的逻辑: class A { void someMethod(){ for(B b: bList){ //some logic for b } }} 执行以下测试时我得到一个异常: @RunWith(MockitoJUnitRunner.class)class ATest { @Mock private B b; @Mock private Ma
我想测试的方法有一个for循环与bList中的每个元素的逻辑:
class A {
    void someMethod(){

        for(B b: bList){
            //some logic for b
        }
    }
}

执行以下测试时我得到一个异常:

@RunWith(MockitoJUnitRunner.class)
class ATest {

    @Mock
    private B b;

    @Mock
    private Map<Int,List<B>> bMap;

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private List<B> bList;

    @Spy
    @InjectMocks
    private C c;
    ....

    @Test
    public void test(){

        //this line executes fine
        when(bList.size()).thenReturn(1);

        //strangely this works fine
        when(bMap.get(any())).thenReturn(bList);

        //ClassCastException
        when(bList.get(0)).thenReturn(b); // or when(bList.get(anyInt())).thenReturn(b);

        c.methodIWantToTest();
    }
}

我得到的例外是:

java.lang.ClassCastException:
org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$cannot be cast to xyz.B

以前有没有人遇到过,并提出了解决方法?

我已经搜索了一个解决方案,并且遇到了一些链接:
http://code.google.com/p/mockito/issues/detail?id=251

http://code.google.com/p/mockito/issues/detail?id=107

解决方法

如 this link you posted所示,您遇到了Answers.RETURNS_DEEP_STUBS的错误.

实际上我没有看到任何理由在您的示例代码中实际使用RETURNS_DEEP_STUBS.你真的应该尝试评估你是否需要深刻的存根,因为,作为Mockito docs say,“每次模拟一个模仿一个童话死亡”.所以如果可以的话,只需把它拿出来,你的例子就可以了.

但是,如果您坚持使用深层存根,则可以通过向Object转换方法调用返回值来解决此错误.例如,使用以下代码替换代码中的违规行:

when((Object)bList.get(0)).thenReturn(b);

所有这一切,我个人同意@jhericks.最好的解决方案可能是使用一个包含你的模拟的实际的ArrayList,而不是嘲笑List.唯一的问题就是让你的列表被注入,所以你必须使用@Spy.例如:

@RunWith(MockitoJUnitRunner.class)
class ATest{
  private B b = mock(B.class);
  @Spy
  private List<B> bList = new ArrayList<B>() {{ add(b); }};

  @InjectMocks
  private C c = new C();

  @Test
  public void test(){
    c.methodIWantToTest();
    // verify results
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读