为什么被模拟的类不能进入非模拟函数?

问题描述 投票:0回答:2

我有一节课:

@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?

java unit-testing spring-boot mockito
2个回答
1
投票

我同意备忘录,但如果你想这样做,你可以使用真正的部分模拟https://static.javadoc.io/org.mockito/mockito-core/2.20.0/org/mockito/Mockito.html#16例如:

when(mock.someMethod()).thenCallRealMethod();

0
投票

这是一个模拟,所以它没有实现真正的方法。你可能想要使用间谍。

© www.soinside.com 2019 - 2024. All rights reserved.