使用Mockito创建一系列模拟



我正在尝试创建一个模拟列表的单独方法。例如。我们有一个Entity

class Entity {
    public List<SubEntity> subEntities;
}

,但是SubEntity是具有两个实现的接口:

class SubEntityA implements SubEntity {
    public SomeType someProp;
}

class SubEntityB implements SubEntity {
    public SomeAnotherType someAnotherProp;
}

所以我可以在subEnities属性中使用SubEntityASubEntityB对象的混合列表。

实际情况下,我有更多的两种类型,我想编写一个测试,其中我需要在其中生成不同数量的此类模拟并将其添加到属性subEntities中。我可以轻松地使用一个模拟:

mock(SubEntityA.class)

但是,当我想做这样的事情时:

private List<SubEntity> getMocks(Class<? extends SubEntity> classToMock, int amount) {
    List<SubEntity> mocks = new ArrayList<>();
    for (int i = 0; i < amount; i++) {
        mocks.add(mock(classToMock));
    }
    return mocks;
}

我使用例如List<SubEntityA> list = getMocks(SubEntityA.class, 3),因为SubEntityA.classSubEntityB.class无法将其投入到Class<? extends SubEntity>

我在做错什么?我该怎么做才能正确地通过课程?我试图找到Mockito的方法,但仅找到Mockito.anyListOf。据我了解,在我的情况下它不起作用。

谢谢!

[upd]测试看起来像:

@Mock
private RepoSubA repoA;
@Mock
private RepoSubB repoB;
@Mock
private Repo repo;
@InjectMocks    
private LogicBean testee;
@Test
public void test() {
    //given
    List<SubEntityA> listA = getMocks(SubEntityA.class, 3);
    List<SubEntityB> listB = getMocks(SubEntityB.class, 3);
    List<SubEntity> list = new ArraList<>();
    list.addAll(listA);
    list.addAll(listB);
    Rule rule = someFixture();
    when(repoA.getA(rule.getId())).thenReturn(listA);
    when(repoB.getB(rule.getId())).thenReturn(listB);
    //when
    List<SubEntity> result = testee.someMagic(rule);
    //then
    assertThat(result, hasSize(list.size());
}

我试图获得错误但失败。这是我写的代码。

public static class Entity {
    public List<SubEntity> subEntities;
}
public static class SubEntityA implements SubEntity {
}
public static class SubEntityB implements SubEntity {
}
private List<? extends SubEntity> getMocks(Class<? extends SubEntity> classToMock, int amount) {
    List<SubEntity> mocks = new ArrayList<>();
    for (int i = 0; i < amount; i++) {
        mocks.add(mock(classToMock));
    }
    return mocks;
}
@Test
public void test(){
    assertEquals(3, getMocks(SubEntityA.class, 3).size());
    List<SubEntityA> mocks = (List<SubEntityA>) getMocks(SubEntityA.class, 3);
    assertEquals(3, getMocks(SubEntityB.class, 3).size());
}
然后,我在测试方法上执行了Junit。测试通过了。

编辑:要回复您的评论,您可以更改GetMocks方法的签名,以便可以将输出施加到List<SubEntityA>。我在上面编辑了我的代码,并且演员阵容起作用。

以下更严格和一致,因为您将同一类用于返回列表类型。

private static <T extends SubEntity> List<T> getMocks(Class<T> classToMock, int amount) {
    List<T> mocks = new ArrayList<>();
    for (int i = 0; i < amount; i++) {
        mocks.add(mock(classToMock));
    }
    return mocks;
}

相关内容

  • 没有找到相关文章

最新更新