当前位置: 首页 > 知识库问答 >
问题:

如何从模拟方法修改虚空方法的输入参数

李经国
2023-03-14

我的成绩是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测试函数。我正在尝试更新传递的第一个参数(列表参数),即第二个参数中的noAnnamize(noAnnamize,ANON_DIRNO_ANON,"tmpLang","name");

    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来模拟ulual第二个方法来更新列表。如何使用mockto测试用例来更新ulualmethod中的参数。

共有1个答案

阚英睿
2023-03-14

当单元测试一个类时,你通过它的公共方法来测试它。如果你不能通过它的公共方法充分地测试这个类,它需要被重构。

在这种情况下,您试图为不存在的边缘情况单元测试私有方法。为什么甚至提供常量作为参数?为什么不直接在私有方法中引用它并保存传递参数?相反,您可以编写:

< code > fr = new FileReader(ANON _ DIR NO _ ANON);

编辑

在 Laxmi 和我进行了讨论之后,我们提出了一个解决方案,使用基于构造函数的依赖关系注入,并更改 void 方法以返回 Set

 类似资料:
  • 我试图模仿下面的行,但它在执行时给出了一个错误,它说: 此处检测到错误的参数匹配器: when(mock.get(anyInt())).thenreturn(null); doThrow(new RuntimeException()).When(mock).SomeVoidMethod(anyObject()); verify(mock).somemethod(contains(“foo”)) 这

  • 我知道在C++中没有什么比虚拟模板方法更好的了,但似乎它正是我所需要的。有什么办法可以让我使用吗?我很感谢任何建议。 我想通过add方法将实体添加到向量中,这些实体需要是虚拟的,也需要模板,如何避免这种情况?

  • 问题内容: 在继承中虚拟函数如何在后台工作?编译器是否特别对待虚拟函数? 问题答案: 是的,编译器和运行时对虚拟方法的处理方式有所不同。JVM专门利用虚拟方法表进行虚拟方法分配: 对象的调度表将包含对象的动态绑定方法的地址。通过从对象的分派表中获取方法的地址来执行方法调用。属于同一类的所有对象的分发表都是相同的,因此通常在它们之间共享。属于类型兼容类的对象(例如,继承层次结构中的同级对象)将具有具

  • 相比之下,Java确实允许虚拟泛型方法。这里也清楚了如何实现:Java泛型在运行时被删除,因此泛型方法是运行时的常用方法,因此不需要修改。 但是现在到了C#。C#确实有具体化的泛型。对于具体化泛型,特别是当使用值类型作为类型参数时,泛型方法必须有不同的版本。但是我们遇到了与C++相同的问题:每当对泛型方法进行新的实例化时,我们都需要修改vtable。 我对C#的内部工作没有太深的了解,所以我的直觉

  • 所以,基本上我创建了一个包装器类,它创建了一个简单的OpenGL应用程序。我的想法是在准备好的时候有这样的东西: 所以,基本上这个类使用GLFW封装了一个简单的OpenGL窗口。这个想法是,当你想要创建一个新的应用程序时,你只需要从应用程序类(我正在写的)派生你的类。使用这个新类,您只需重写虚拟方法(main Loop、初始化和回调),您将拥有一个工作应用程序。 下面是基类: 所以我所做的是将在派

  • 但是不知何故,method3()并没有被嘲笑,我仍然看到它打印的内容。但是,我可以成功地模拟method2()。也许是因为method2()是从method1()直接调用的,我正在测试的方法是什么?请建议我如何模拟方法3。 谢谢,梅赫