Java 使用JUnit和Mockito测试局部变量

Java 使用JUnit和Mockito测试局部变量,java,junit,mockito,Java,Junit,Mockito,我正在使用JUnit编写测试用例,并且尽可能使用MockitoAPICollection-filteredCollection=CollectionUtils.select(configs,beanPredicate)是我在测试中遇到的代码。我无法模拟CollectionUtils,因为在存根时我没有获取select()。如果我不使用Mockito,那么如何根据需要更改filteredCollection的值。我希望它的大小为>0,这样我就可以在Cobertura报告中涵盖第二条if语句 试验方

我正在使用
JUnit
编写测试用例,并且尽可能使用
Mockito
API
Collection-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;
}
公共列表getAppConfig(字符串configCode){ List=null; List configs=getAppConfig(); 如果(配置!=null){ EqualPredicate name eqlPredicate=新的EqualPredicate(配置代码); BeanPredicate BeanPredicate=新的BeanPredicate(“configCode”,nameEqlPredicate); Collection filteredCollection=CollectionUtils.select(configs,beanPredicate); if(filteredCollection!=null&&filteredCollection.size()>0){ 列表=新的ArrayList(); 用于(AppConfigTO:filteredCollection){ 列表。添加(到); } } }否则{ list=appConfigDao.getAppConfig(configCode); } 退货清单; } 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());
}
@测试
public void testGetAppConfig()引发异常{
AppConfigManager appManager=新的AppConfigManager();
cacheProvider=new TestAppConfigManager();
IAppConfigManager-configManager=Mockito.mock(IAppConfigManager.class);
IAppConfigDao configDao=Mockito.mock(IAppConfigDao.class);
列表=新的ArrayList();
Mockito.when(configManager.getAppConfig()).thenReturn(list);
Mockito.when(configDao.getAppConfig()).thenReturn(list);
setAppConfigDao(configDao);
list=appManager.getAppConfig(配置代码);
assertNull(列表);
assertNotNull(appManager.getAppConfigDao());
资产相同(“04852”,此.CONFIG_代码);
assertNotNull(configManager.getAppConfig());
//没有配置管理器
appManager=新的AppConfigManager();
cacheProvider=new TestAppConfigManager();
configManager=Mockito.mock(IAppConfigManager.class);
configDao=Mockito.mock(IAppConfigDao.class);
列表=新的ArrayList();
Mockito.when(configManager.getAppConfig()).thenReturn(null);
Mockito.when(configDao.getAppConfig()).thenReturn(null);
setAppConfigDao(configDao);
list=appManager.getAppConfig(配置代码);
assertTrue(list.isEmpty());
assertNotNull(appManager.getAppConfigDao());
资产相同(“04852”,此.CONFIG_代码);
assertNull(configManager.getAppConfig());
}
是否有任何方法可以进行测试

提前谢谢

我还尽可能使用MockitoAPI

而不是“尽可能”使用Mockito, 更好的方法是在没有更好的方法时使用Mockito

因此,您需要练习分支
filteredCollection.size()>0
。在代码中,我看到此集合的内容由
configCode
方法参数和
getAppConfig()
的返回值决定。 使用可以很容易地控制这些。为它们使用适当的值来触发所需的执行路径

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

顺便说一句,这里有一个更好的方法来控制AppConfigManager.getAppConfig()返回的值,而不使用mock:

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

AppConfigManager appManager = new AppConfigManager() {
    @Override
    public List<AppConfigTO> getAppConfig() {
        return dummyList;
    }
};
//适当地填写此列表
最终列表dummyList=Arrays.asList(…);
AppConfigManager appManager=新建AppConfigManager(){
@凌驾
公共列表getAppConfig(){
返回dummyList;
}
};
这种技术被称为“扩展和覆盖”

我还尽可能使用MockitoAPI

而不是“尽可能”使用Mockito, 更好的方法是在没有更好的方法时使用Mockito

因此,您需要练习分支
filteredCollection.size()>0
。在代码中,我看到此集合的内容由
configCode
方法参数和
getAppConfig()
的返回值决定。 使用可以很容易地控制这些。为它们使用适当的值来触发所需的执行路径

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

顺便说一句,这里有一个更好的方法来控制AppConfigManager.getAppConfig()返回的值,而不使用mock:

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

AppConfigManager appManager = new AppConfigManager() {
    @Override
    public List<AppConfigTO> getAppConfig() {
        return dummyList;
    }
};
//适当地填写此列表
最终列表dummyList=Arrays.asList(…);
AppConfigManager appManager=新建AppConfigManager(){
@凌驾
公共列表getAppConfig(){
返回dummyList;
}
};

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

你说得对,Janos,我认为这是一种更干净的方法。我甚至想用PowerMockito,但没有更多。谢谢。很高兴你喜欢它,这真是一种很好的思维方式,坚持下去。你是对的,雅诺斯,我认为这是一种更干净的思维方式。我甚至想用PowerMockito,但没有更多。谢谢。很高兴你喜欢它,这真是一种很好的思维方式,坚持下去