Как смоделировать значение для проверки условия в другом методе с помощью JUnit / Mockito? - PullRequest
0 голосов
/ 26 июня 2019

Я новичок в JUnit и Mockito и пытаюсь смоделировать значение, возвращаемое из логического метода, для попадания внутрь условного выражения.

Я попробовал ответ из этого поста , но, похоже, не работает для этого. Я пытался использовать шпион, тогда CallRealMethod, не могу понять это.

Я проверял, когда значение истинно, но я не могу проникнуть внутрь остальной части для теста.

Вот пример того, что я сделал:

ServiceImpl.java имеет метод register (), который вызывает логический метод shouldRegister (). Метод shouldRegister () просто проверяет другую службу, чтобы узнать, является ли логическое значение истинным или ложным, и затем возвращает это.

Если true, он создает полезную нагрузку JsonNode для отправки, иначе, если false, он удаляет одно поле из полезной нагрузки.

// ServiceImpl.java:

// in the record() method: 

if (body.has("fieldtoBeRemoved")) {
   if (shouldRegister()) {
      ((ObjectNode) body).set("fieldtoBeRemoved");
    } else {
       // this is the line I am trying to test
       ((ObjectNode) body).remove("fieldtoBeRemoved");
       }
   }

// method being called above in the conditional
protected boolean shouldRegister() {
        Optional<String> flag = configService.getString("booleanValue");
        String stringFlag = flag.orElse("false");
        return BooleanUtils.toBoolean(stringFlag);
    }


// In the test

@InjectMocks
private ServiceImpl serviceImpl;

@Test
public void testingForFalse() {
     serviceImpl = new ServiceImpl();

     // what I am struggling with, trying to make the value false,
     // so that it hits the else in the record() method in ServiceImpl
    // and removes fieldtoBeRemoved from the payload
    when(serviceImpl.shouldRegister()).thenCallRealMethod();
   doReturn(false).when(spy(serviceImpl)).shouldRegister();

    assertThat(fieldtoBeRemoved, is(""));

}


Когда я запускаю это, происходит сбой, потому что значение fieldtoBeRemoved не пустое, оно имеет значение из поля в полезной нагрузке, которого у него не должно быть. Я предполагаю, что значение все еще возвращается как истинное, потому что я не насмехаюсь правильно / устанавливая его как ложное для этого теста. Я также пытался издеваться над вызовом метода record (). Любая помощь приветствуется!

1 Ответ

0 голосов
/ 26 июня 2019

Вы можете сделать что-то подобное, если исходный код и тест находятся в одном пакете, а shouldRegister как минимум для пакета

@Test
public void testingForFalse() {
    serviceImpl = new ServiceImpl() {
        @Override
        public boolean shouldRegister() {
            return false;
        }
    }

    // rest of the test
}

В этом случае вам не нужно издеваться над этим методом.

...