我想测试以下课程:
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();
}
}
Bar使用FooRepository
,我想模仿。如果我测试Bar
,这可以正常工作,但我如何测试ClassToTest
并仍然模拟FooRepository
?
我不能只是模拟Bar
,因为会创建具有不同值的多个实例。我需要测试它们是否正确创建。
答案 0 :(得分:0)
如果您正在测试FooRepository
,则不必模拟ClassToTest
,因为它将作为此课程的黑盒子。你要做的只是模仿Bar
并写下测试。
但在此之前,您必须开始在Bar
注入ClassToTest
作为依赖性,就像FooRepository
Bar
中Bar
的情况一样Bar bar = new Bar();
1}}。
这是因为如果你的方法中有以下语句,那么将为ClassToTest
创建一个新的onject,并且你无法用你的模拟替换它。
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(...);
}
}
应如下所示:
{{1}}
您的测试类应如下所示:
{{1}}