java - 为什么模拟类不进入非模拟函数?
问题描述
我有一堂课:
@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);
}
[...]
}
使用调试器运行函数 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();
推荐阅读
- php - 在 laravel 中合并和合并数组
- python - 如何检查字符串列表中的多个单词?
- python - 如何基于一个数据框中的一列和第二个数据框中的两列合并两个数据框
- azure-devops - Azure DevOps 任务控制选项:无法更改“运行此任务”下拉菜单
- python - 如何连接到本地运行的 MSSQL?
- ssis - 虽然将数据从 Excel 导入 SQL DB SSIS 显示整数列为 NULL
- android - 根据名称显示图像 (Kotlin)
- postgresql - Postgresql 的 URL 规范化
- c++ - 创建原始套接字客户端以连接到 Web 主机
- javascript - 用于下载的 XML 文件的编码