ace*_*es. 11 java testing mocking mockito
我想测试的方法有一个for循环,其中包含bList中每个元素的逻辑:
class A {
void someMethod(){
for(B b: bList){
//some logic for b
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行以下测试时出现异常:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
java.lang.ClassCastException:
org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$ cannot be cast to xyz.BRun Code Online (Sandbox Code Playgroud)
有没有人遇到过这个并提出解决方法?
我搜索了一个解决方案并遇到了一些链接:http://code.google.com/p/mockito/issues/detail?id = 251 和 http://code.google.com/p/mockito/issues /细节?ID = 107
Tim*_*ote 20
正如您发布的此链接所示,您遇到了一个错误Answers.RETURNS_DEEP_STUBS.
我实际上没有看到任何理由RETURNS_DEEP_STUBS在您的示例代码中实际使用.你真的应该尝试评估你是否需要深层存根,因为,正如Mockito文档所说,"每当模拟器返回模拟器时,仙女就会死亡." 所以如果可以,那就把它拿出来,你的例子就可以了.
但是,如果您坚持使用深层存根,则可以通过将方法调用的返回值向上转换来解决此错误Object.例如,用以下代码替换代码中的违规行:
when((Object)bList.get(0)).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
所有这些,我个人同意@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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15718 次 |
| 最近记录: |