Как изменить входной параметр метода void из метода mocked с ответом mockito - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть класс 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 - конечное статическое значение.Этот класс имеет функцию first и функцию second. В первой функции есть вызывающий метод, который вызывает вторую функцию.Вторая функция - это функция 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", "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);

          }

ПРОБЛЕМА: я не могу издеваться над вторым методом void, чтобы обновить список значениями a и b.Как получить контрольный пример для обновления параметра в методе void.

1 Ответ

0 голосов
/ 31 декабря 2018

При модульном тестировании класса вы тестируете его с помощью его открытых методов.Если вы не можете достаточно протестировать класс с помощью его открытых методов, он нуждается в перефакторинге.

В этом случае вы пытаетесь выполнить модульное тестирование частного метода для крайнего случая, который не существует.Зачем даже предоставлять константу в качестве параметра?Почему бы не ссылаться на него напрямую в приватном методе и сохранить передачу аргумента?Вместо этого вы могли бы написать:

fr = new FileReader(ANON_DIR + NO_ANON);

РЕДАКТИРОВАТЬ

После того, как мы с Лакшми провели обсуждение, мы пришли к решению с использованием конструктора на основевнедрение зависимости и изменение метода void для возврата Set<String>.Это позволяет нам тестировать в изоляции и легко издеваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...