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(...);
}
}