Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mockito创建一个mock数组_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

Java 使用Mockito创建一个mock数组

Java 使用Mockito创建一个mock数组,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我正在尝试创建一个单独的方法来创建模拟列表。例如,我们有一个类实体: class Entity { public List<SubEntity> subEntities; } 及 因此,我可以在subentities属性中混合列出SubEntityA和SubEntityB对象 在实际情况中,我有两种以上的类型,我想编写一个测试,其中我需要生成不同数量的此类模拟,并将其添加到属性子实体。我可以使用以下工具轻松装箱一个模拟: mock(SubEntityA.class) 但当

我正在尝试创建一个单独的方法来创建模拟列表。例如,我们有一个类
实体

class Entity {
    public List<SubEntity> subEntities;
}

因此,我可以在
subentities
属性中混合列出
SubEntityA
SubEntityB
对象

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

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;
}

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

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());
}
公共静态类实体{
公开名单子实体;
}
公共静态类SubEntityA实现子实体{
}
公共静态类SubEntityB实现子实体{
}

private List以下是更严格和一致的,因为您对返回列表类型使用相同的类

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;
}
私有静态列表getmock(类classToMock,int-amount){
List mock=new ArrayList();
对于(int i=0;i
getMocks(SubEntityA.class,amount)
将完美编译。此外,您不会在代码中执行任何强制转换。请共享完整的stracktrace。@davidxxx只有一个错误:
错误:(101,84)java:不兼容的类型:java.util.List无法转换为java.util.List
不幸的是,我应该为每种类型创建不同的列表,然后将它们添加到
子实体
。因为
子实体
是一个接口,为什么实际类型很重要?是否存在使测试更加困难的/casting实例?是的,这很重要,因为我还需要模拟存储库的结果。从
列表
转换到
列表
有问题。
getMocks(…)
的结果应该设置为
when(repo.getEntitiesA())。然后返回(list)
。我在您的问题中使用了代码。是否有更多的代码没有包括在内?如果是这样的话,你能不能把代码包括进来,并具体说明错误发生的地方。谢谢你的评论,我已经提供了有问题的测试示例。它很有效!现在的测试可能会更漂亮!谢谢你的帮助!
@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());
}
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;
}