[英]Mockito: mock injected member of newly generated object
我想測試以下課程:
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
,因為創建了具有不同值的多個實例。 而且我需要測試它們是否正確創建。
如果您正在測試ClassToTest
,則實際上不必模擬FooRepository
,因為它將用作此類的黑匣子。 所有你應該做的是模擬出來的Bar
,並寫測試。
但是這樣做,你就必須開始注射之前Bar
為dependecy在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(...);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.