首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用mockito答案从模拟方法修改void方法的输入参数

如何用mockito答案从模拟方法修改void方法的输入参数
EN

Stack Overflow用户
提问于 2018-12-30 23:48:47
回答 1查看 337关注 0票数 1

我有个A班

代码语言:javascript
复制
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是静态的最终值。该类具有函数优先和函数第二,.The第一函数有一个调用方法,调用第二个函数。第二个函数是以静态字段为参数的空函数。

第二个函数就是文件读取函数,其路径如下

代码语言:javascript
复制
   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测试这个函数。我正在尝试更新传递的第一个参数(列表参数),即second(noAnonymize,ANON_DIR + NO_ANON中的noAnonymize、"tmpLang“、"name");

代码语言:javascript
复制
    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);

          }

问题:我无法用值a和b来模拟void方法来更新列表。如何在void中使用mockto测试用例来更新参数。

EN

回答 1

Stack Overflow用户

发布于 2018-12-30 23:58:06

当单元测试一个类时,您可以通过它的公共方法来测试它。如果您不能通过它的公共方法对类进行充分的测试,那么它需要重新分解。

在本例中,您尝试对不存在的边缘情况的私有方法进行单元测试。为什么还要提供常数作为参数呢?为什么不直接在私有方法中引用它并保存传递参数呢?相反,你可以写:

fr = new FileReader(ANON_DIR + NO_ANON);

编辑

在Laxmi和我进行了讨论之后,我们提出了一个解决方案,它使用基于构造函数的依赖注入和更改void方法来返回Set<String>。这让我们可以轻松地进行隔离测试和模拟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53982374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档