Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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:新生成对象的模拟注入成员_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java Mockito:新生成对象的模拟注入成员

Java Mockito:新生成对象的模拟注入成员,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我想测试以下类: public class ClassToTest { private List<Bar> bars = new LinkedList<>(); public makeBarsFromIDs(List<Integer> idList) { for (Integer id : idList) { Bar bar = new Bar(); bar.setID(id);

我想测试以下类:

public class ClassToTest {
    private List<Bar> bars = new LinkedList<>();

    public makeBarsFromIDs(List<Integer> idList) {
        for (Integer id : idList) {
            Bar bar = new Bar();
            bar.setID(id);
            bars.add(bar);
        }
    }

    public List<String> getFooStringsFromBars() {
        List<String> fooStrings = new LinkedList();
        for (Bar bar : this.bars)
            fooStrings.add(bar.getFooListAsString());
        return fooStrings;
    }
}
Bar使用了
FooRepository
,我想模拟一下。如果我测试
条形图
,这很好,但是如何测试
ClassToTest
,并且仍然模拟
FooRepository


我不能只模拟
,因为创建了多个具有不同值的实例。我需要测试它们是否被正确创建。

如果您正在测试
ClassToTest
,那么实际上不必模拟
FooRepository
,因为它将作为此类的黑盒。您所要做的就是模拟
并编写测试

但在这样做之前,您必须开始在
ClassToTest
中注入
Bar
作为依赖项,就像在
Bar
的情况下为
FooRepository
注入一样

这是因为如果您的方法中有以下语句,那么将为
Bar
创建一个新的onject,并且您无法用mock替换它

Bar bar = new Bar();
进行相关更改后,您的
ClassToTest
应如下所示:

public class ClassToTest {

    @Inject
    private Bar bar;

    public addToBarList(barID) {
        bar.setID(fooID);

        List<Foo> fooList = bar.getFooList();
        ...
    }
}
public class SomeTest {

    @Mock
    private Bar bar;

    @InjectMocks
    private ClassToTest testClass;

    @Before
    public void init() {
        Mockito.initMocks(this);
    }

    @Test
    public void testAdd() {
        Mockito.when(bar.getFooList()).thenReturn(Arrays.asList(new Foo()));
        testClass.addToBarList(...);
    }
}

如果您想模拟
Bar
,则不能执行
Bar=newbar()。如果您使用的是像Spring这样的框架,那么将
Bar
作为依赖项注入,然后将其模拟出来。我不想模拟Bar,我想模拟Bar中的fooRepository。我对示例代码的精简程度有点太高。问题是,
ClassToTest
在一个循环中创建多个“Bar”对象。我怎么嘲笑他们?我想也许像PowerMock这样的扩展可以做到这一点。正如我在上一篇评论中所写的,我的示例代码被剥离得太多了。我实际上拥有的是一个
集合
,由
ClassToTest
@user2727133填充。有时,为了有效地使用
Mockito
等框架,您必须重新考虑您的设计。请包括缺少的代码,然后也许我可以帮助你更好。我现在编辑了我的代码。非常感谢你的努力。
public class SomeTest {

    @Mock
    private Bar bar;

    @InjectMocks
    private ClassToTest testClass;

    @Before
    public void init() {
        Mockito.initMocks(this);
    }

    @Test
    public void testAdd() {
        Mockito.when(bar.getFooList()).thenReturn(Arrays.asList(new Foo()));
        testClass.addToBarList(...);
    }
}