gpt4 book ai didi

java - Mockito ClassCastException

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:42 24 4
gpt4 key购买 nike

我要测试的方法有一个 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=251http://code.google.com/p/mockito/issues/detail?id=107

最佳答案

作为this link you posted表示您遇到了 Answers.RETURNS_DEEP_STUBS 的错误。

我实际上没有看到任何理由在您的示例代码中实际使用 RETURNS_DEEP_STUBS。你真的应该尝试评估你是否需要深度 stub ,因为,作为 Mockito docs say , “每次 mock 返回一个 mock 时,一个仙女就会死去。”因此,如果可以,只需将其取出,您的示例就会起作用。

但是,如果您坚持使用深层 stub ,则可以通过将方法调用的返回值向上转换为 Object 来绕过此错误。例如,将代码中有问题的行替换为:

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

综上所述,我个人同意@jhericks。最好的解决方案可能是使用包含模拟的实际 ArrayList,而不是模拟 List。唯一的问题是让你的列表被注入(inject),所以你必须使用 @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
}
}

关于java - Mockito ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com