我想测试以下类:
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;
}
}
在 addToBarList 中,Bar
对象是实例化的。
public class Bar {
private int myID;
@Inject
private FooRepository fooRepository;
public setID(int ID) {
myID = ID;
}
public String getFooListAsString() {
return fooRepository.findByID(myID).toString();
}
}
酒吧使用FooRepository
,我想嘲笑。如果我测试Bar
,这工作正常,但是我如何测试ClassToTest
并且仍然模拟FooRepository
?
我不能只是模拟Bar
,因为创建了多个具有不同值的实例。我需要测试它们是否正确创建。
正在测试ClassToTest
,你真的不必嘲笑FooRepository
,因为它将作为这个类的黑盒。您要做的就是模拟Bar
并编写测试。
但在此之前,您必须开始将Bar
作为依赖项注入ClassToTest
,就像您在FooRepository
的情况下Bar
一样。
这是因为如果你的方法中有以下语句,那么将为Bar
创建一个新的onject,并且你无法用你的模拟替换它。
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(...);
}
}