繁体   English   中英

使用真实实现的Mockito模拟对象

[英]Mockito mock object using real implementation

为什么mockMap使用真正的实现? 我该如何防止这种情况?

在方法testFirstKeyMatch中

when(mockMap.keySet().toArray()[0])...

抛出ArrayIndexOutOfBoundsException:运行测试时为0。

MaxSizeHashMap是一个最大大小为7的LinkedHashMap,当我尝试添加更多内容时抛出一个IndexOutOfBoundsException。

配置文件记录对此不重要的内容。

SuperClass.java

public class SuperClass {

protected String[] days;
protected MaxSizeHashMap<String, String> map;

public SuperClass() {
    days = new String[7];
    map = new MaxSizeHashMap<String, String>();
    //...
}

void updateDays() {

    cal = Calendar.getInstance();

    for (int i = 0; i < 7; i = i + 1) {

        //adds short names "Mon", "Tue", ... to days
        days[i] = cal.getDisplayName(Calendar.DAY_OF_WEEK, 
                Calendar.SHORT, Locale.US);

        cal.add(Calendar.DATE, 1);
    }
}

void firstKeyMatch(Profile profile) {

    updateDays(); 

    //checks if first key of map is not same as days[0]
    if (days[0] != map.keySet().toArray()[0]) {

        profile.add();

        //...
     }
 }
 }

SuperClassTest.java

@RunWith(MockitoJUnitRunner.class)
public class SuperClassTest {

@InjectMocks
private SuperClass spr = new SuperClass();

@Mock
private MaxSizeHashMap<String, String> mockMap;

@Mock
private Profile mockProfile;

//...

@Test
public void testFirstKeyMatch() {   

    when(mockMap.keySet().toArray()[0]).thenReturn(spr.days[0]);

    verify(mockProfile, never()).add();

}
}

根据文档 ,mockito对mock的隐式行为是返回默认值

默认情况下,对于返回值的所有方法,mock将根据需要返回null,基元/原始包装器值或空集合。 例如0表示int / Integer,false表示布尔值/布尔值。

因此,您的mockMap.keySet()将返回一个空的哈希集,然后您将其转换为空数组并尝试检索(不存在的)第一个元素,从而检索IOOBE。

调试器

总而言之,mockito并没有使用真正的实现,但它的行为正常。

你没有发布SuperClass的整个构造SuperClass ,但可能在你实例化地图之后,你也用值填充它。 如果这是真的,那么可以说这个例外实际上证明了mockito没有使用真正的实现,因为你真的得到了第一个元素。

至于解决方案,已经建议用你需要的任何数据返回你自己的哈希集(信用去Abubakkar):

when(mockMap.keySet()).thenReturn(new HashSet(Arrays.asList("your day string")));

要重定向所有mockMap.keySet().toArray()[i]调用spr.days[i] ,您可以告诉mockMap在有人请求密钥集时返回days数组。

Set keySetMock = mock(Set.class);
when(keySetMock.toArray()).thenReturn(spr.days);
when(mockMap.keySet()).thenReturn(keySetMock);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM