我的A类是
Class A{
private static final String ANON_DIR = "/webapps/worldlingo/data/anonymizer/";
private static final String NO_ANON = "noanonymize";
public String first(String text, String srclang, Map dictTokens) {
Set<String> noAnonymize = new HashSet<String>();
second(noAnonymize,ANON_DIR + NO_ANON, "tmpLang","name");
String value;
if(noAnonymize.contains("test")){
value = "test1";
}
else {
value = "test";
}
return value;
}
其中ANON_DIR和NO_ANON是静态最终值。此类具有第一个函数,第二个函数。第一个函数具有一个调用方法,该方法调用第二个函数。第二个函数是void函数,它将静态字段作为参数。
第二个功能只是文件读取功能,提供的路径为
public void second (Set<String> hashSet, String path, String lang , String type) {
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(path);
br = new BufferedReader(fr);
String Line;
while ((Line = br.readLine()) != null) {
hashSet.add(Line);
}
} catch (IOException e) {
log.error("Anonymizer: Unable to load file.", e);
} finally {
try {
if (fr != null) {
fr.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
log.error("Anonymizer : An error occured while closing a resource.", e);
}
}
}
}
现在,我尝试首先使用Mockito测试该功能。我正在尝试更新传递的第一个参数(列表参数),即第二个 noAnonymize ( noAnonymize ,ANON_DIR + NO_ANON,“ tmpLang”,“名称”);
public void testfirst() throws Exception {
Anonymizer mock = PowerMockito.mock(Anonymizer.class);
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
List<String> args = invocation.getArgumentAt(0,List.class);
args.add("a");
args.add("b");
return null; // void method, so return null
}
}).when(mock).readNoAnonymizeFile(Mockito.anySet(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString());
Method anonymizeNames = anon.getClass().getDeclaredMethod("anonymizeNames_test", String.class, String.class, Map.class);
String srcLang = "MSFT_EN";
Map mapTokens = new HashMap();
String result = (String) anonymizeNames.invoke(anon,"I am David",srcLang,mapTokens);
}
问题: 我无法模拟void second方法来更新具有值a和b的列表。我怎样才能让模拟测试用例更新void方法中的参数。
答案 0 :(得分:0)
在对类进行单元测试时,可以通过其公共方法对其进行测试。如果您无法通过其公共方法充分测试该类,则需要对其进行重构。
在这种情况下,您尝试对不存在的边缘情况进行私有方法的单元测试。为什么甚至提供常量作为参数?为什么不直接在私有方法中引用它并保存传递参数呢?相反,您可以编写:
fr = new FileReader(ANON_DIR + NO_ANON);
编辑
在Laxmi和我讨论之后,我们提出了一个使用基于构造函数的依赖注入并更改void
方法以返回Set<String>
的解决方案。这使我们能够进行隔离测试并轻松进行模拟。