【问题标题】:Mocking a static method call inside iterator using Mockito使用 Mockito 在迭代器中模拟静态方法调用
【发布时间】:2020-10-20 07:30:57
【问题描述】:

我对此完全陌生。请原谅我对这方面的原始知识。 所以,这是我正在测试的一段代码

private static void updateRules(String id) throws IOException {
    // Make list
    List<String> select = Arrays.asList(
            ID,
            NAME,
            APP_RULES,
            RULE_CONFIG);
    // Fetch list
    List<Map<String, Object>> entries = StaticUtil.list(select, id);
    // Iterate over the entries
    for (Map<String, Object> obj : entries) {
        // Call create
        CreateStaticUtils.create();
    }
}

我试图模拟这个函数的行为,

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticUtil.class)
class MyTest {    
    private Iterator<String> listIterator;
    
    @SuppressWarnings("unchecked")
    @Test
    public final void testUpdateRules() throws IOException {
        PowerMockito.mockStatic(StaticUtil.class);
        PowerMockito
        .when(StaticUtil.list(Mockito.anyListOf(String.class),
                Mockito.anyString()))
        .thenReturn(Mockito.anyList());
        PowerMockito.verifyStatic(Mockito.times(1));
        
        listIterator = mock(Iterator.class);
        when(listIterator.hasNext()).thenReturn(<**Confused here**>)
    }

我不确定如何验证CreateStaticUtils.create() call inside the iterator

如何模拟和验证内部相同的交互?

另外,我必须把它也写成@PrepareForTest(CreateStaticUtils.class)吗?

请帮帮我吗?

【问题讨论】:

    标签: java unit-testing for-loop mockito powermockito


    【解决方案1】:

    你真的要嘲笑它吗?如果静态方法(类)实现不在外部 API 中,您当然可以在此测试中创建测试类的实例或创建此实例的任何工厂,并像正常功能一样对其进行测试,无需模拟

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2014-02-02
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多