使用JUnit和Mockito

时间:2016-05-12 20:52:35

标签: java junit mockito

我正在使用JUnit编写测试用例,我也尽可能使用Mockito API。 Collection<AppConfigTO> filteredCollection = CollectionUtils.select(configs, beanPredicate);是我坚持测试的代码。我不能嘲笑CollectionUtils,因为我在叮叮当时没有得到select()。如果我不使用Mockito,那么我应该如何根据需要更改filteredCollection的值。我想要它的大小>0,以便我可以覆盖Cobertura报告中的第二个if语句。

待测方法:

public List<AppConfigTO> getAppConfig( String configCode ) {
    List<AppConfigTO> list = null;

    List<AppConfigTO> configs = getAppConfig();

    if( configs != null ) {
        EqualPredicate nameEqlPredicate = new EqualPredicate( configCode );
        BeanPredicate beanPredicate = new BeanPredicate("configCode", nameEqlPredicate);
        Collection<AppConfigTO> filteredCollection = CollectionUtils.select(configs, beanPredicate);

        if( filteredCollection != null && filteredCollection.size()>0 ) {
            list = new ArrayList<AppConfigTO>();
            for( AppConfigTO to : filteredCollection ) {
                list.add( to );
            }
        }
    }else{
        list = appConfigDao.getAppConfig(configCode);
    }

    return list;
}

JUnit测试用例:

@Test
   public void testGetAppConfig() throws Exception {
    AppConfigManager appManager = new AppConfigManager();
    cacheProvider = new TestAppConfigManager();

    IAppConfigManager configManager = Mockito.mock(IAppConfigManager.class);
    IAppConfigDao configDao = Mockito.mock(IAppConfigDao.class);

    List<AppConfigTO> list = new ArrayList<>();

    Mockito.when(configManager.getAppConfig()).thenReturn(list);
    Mockito.when(configDao.getAppConfig()).thenReturn(list);

    appManager.setAppConfigDao(configDao);
    list = appManager.getAppConfig(CONFIG_CODE);

    assertNull(list);
    assertNotNull(appManager.getAppConfigDao());
    assertSame("04852",this.CONFIG_CODE);
    assertNotNull(configManager.getAppConfig());

    // No ConfigManager
    appManager = new AppConfigManager();
    cacheProvider = new TestAppConfigManager();

    configManager = Mockito.mock(IAppConfigManager.class);
    configDao = Mockito.mock(IAppConfigDao.class);

    list = new ArrayList<>();

    Mockito.when(configManager.getAppConfig()).thenReturn(null);
    Mockito.when(configDao.getAppConfig()).thenReturn(null);

    appManager.setAppConfigDao(configDao);
    list = appManager.getAppConfig(CONFIG_CODE);    

    assertTrue(list.isEmpty());
    assertNotNull(appManager.getAppConfigDao());
    assertSame("04852",this.CONFIG_CODE);
    assertNull(configManager.getAppConfig());
}

有没有办法让我可以继续进行测试。

提前致谢

1 个答案:

答案 0 :(得分:2)

  

我也尽可能使用Mockito API。

而不是“尽可能”使用Mockito, 一个更好的方法是使用Mockito 没有更好的方式

所以你想练习分支filteredCollection.size()>0。在代码中,我看到此集合的内容由configCode方法参数和getAppConfig()的返回值确定。 使用可以轻松控制这些。使用适当的值来触发所需的执行路径。

请注意,测试方法testGetAppConfig做了太多事情。 测试用例应该测试一件事。 将此方法拆分为多个独立的测试方法。

顺便说一句,这是一种更好的方法来控制AppConfigManager.getAppConfig()返回的值,而不使用模拟:

// fill this list appropriately
final List<AppConfigTO> dummyList = Arrays.asList(...);

AppConfigManager appManager = new AppConfigManager() {
    @Override
    public List<AppConfigTO> getAppConfig() {
        return dummyList;
    }
};

这种技术被称为“扩展和覆盖”。