我有一节课:
@Component
public class GCInitializer
{
@Autowired
GCGoodRepository gcGoodRepository;
@PostConstruct
public void onStartup() throws Exception
{
// load/update base data
initGCBaseData();
}
private void initGCBaseData() throws Exception
{
ArrayList<GCGood> dbGoods;
ArrayList<GCGood> fileGoods;
ArrayList<GCGood> baseGoods;
dbGoods = getGCGoodsFromDB();
fileGoods = getGoodsFromFile();
baseGoods = getGoodsFromInitializer();
// do my merge magic
[…]
}
private ArrayList<GCGood> getGoodsFromInitializer() {
ArrayList<GCGood> baseGoods = new ArrayList<>();
[…]
}
[…]
}
此类在启动时搜索三个不同的数据源以获取不同的商品并将它们组合而不重复。
现在我想和Mockito一起编写单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class GCInitializerTest {
@Autowired
GCGoodRepository gcGoodRepository;
@Test
public void onStartupFirstTime() throws InvocationTargetException, IllegalAccessException
{
// normal Start: after Start there are only 7 goods in it!!! (Db far away Off, File empty => only Standards!!!)
GCInitializer gcInitializer = Mockito.mock(GCInitializer.class);
Mockito.when(gcInitializer.getGoodsFromFile()).thenReturn(null);
Mockito.when(gcInitializer.getGCGoodsFromDB()).thenReturn(null);
ReflectionTestUtils.setField(gcInitializer, "gcGoodRepository", gcGoodRepository);
gcGoodRepository.deleteAll();
// private invokation of GCInitializer::initGCBaseData()
Method method = GCInitializer.class.getDeclaredMethod("initGCBaseData");
method.setAccessible(true);
method.invoke(gcInitializer);
assertEquals(Lists.newArrayList(gcGodRepository.findAll()).size(), 7);
}
[...]
}
带调试器的Runnig函数GCInitializer :: getGoodsFromInitializer()从不输入并返回null,而不是带有7个GCGoods的数组。
为什么会这样?我怎样才能实现这个函数给我正确的ArrayList?
我同意备忘录,但如果你想这样做,你可以使用真正的部分模拟https://static.javadoc.io/org.mockito/mockito-core/2.20.0/org/mockito/Mockito.html#16例如:
when(mock.someMethod()).thenCallRealMethod();
这是一个模拟,所以它没有实现真正的方法。你可能想要使用间谍。