我正在尝试创建一个模拟列表的单独方法。例如。我们有一个Entity
:
class Entity {
public List<SubEntity> subEntities;
}
,但是SubEntity
是具有两个实现的接口:
class SubEntityA implements SubEntity {
public SomeType someProp;
}
和
class SubEntityB implements SubEntity {
public SomeAnotherType someAnotherProp;
}
所以我可以在subEnities
属性中使用SubEntityA
和SubEntityB
对象的混合列表。
实际情况下,我有更多的两种类型,我想编写一个测试,其中我需要在其中生成不同数量的此类模拟并将其添加到属性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.class
或SubEntityB.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;
}