Как проверить значение по умолчанию в enum, используя mockito и testNg - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть сторонний класс перечисления, подобный этому:

package se.api;
public enum InvestigationResultStatus {
  PENDING("PendingResult.rr"),
  NEW("NewResult.rr"),
  MODIFIED("ModifiedResult.rr"),
  FINAL("FinalResult.rr"),
  PRELIMINARY("PreliminaryResult.rr"),
  ADDITIONAL("AdditionalResult.rr"),
  REJECTED("RejectedResult.rr"),
  COMPLETE("Path.Results.InvestigationInformation.Complete"),
  UNDEFINED("");

  private final String languageKey;

  private InvestigationResultStatus(String languageKey) {
    this.languageKey = languageKey;
  }

  public String getLanguageKey() {
    return this.languageKey;
  }
}

, и в своем коде я создаю перечисление для этого класса

package se.dto;
public enum InvestigationResultStatus
{
   PENDING,
   NEW,
   MODIFIED,
   FINAL,
   PRELIMINARY,
   ADDITIONAL,
   REJECTED,
   UNDEFINED
}

, чтобы сопоставить эти перечисления с моим перечислением i.Создан enum mapper:

package se.mapper;

import se.dto.InvestigationResultStatus;

public class InvestigationResultStatusMapper
{
  public InvestigationResultStatus mapOmResultStatusToNovaResultStatus(final se.api.InvestigationResultStatus investigationResultStatus){
    switch (investigationResultStatus){
      case PENDING:
        return InvestigationResultStatus.PENDING;
      case NEW:
        return InvestigationResultStatus.NEW;
      case MODIFIED:
        return InvestigationResultStatus.MODIFIED;
      case FINAL:
        return InvestigationResultStatus.FINAL;
      case PRELIMINARY:
        return InvestigationResultStatus.PRELIMINARY;
      case ADDITIONAL:
        return InvestigationResultStatus.ADDITIONAL;
      case REJECTED:
        return InvestigationResultStatus.REJECTED;
      case UNDEFINED:
        return InvestigationResultStatus.UNDEFINED;
      default:
        throw new IllegalArgumentException("Unknown InvestigationResultStatus: " + investigationResultStatus);
    }
  }
}

Теперь я хочу проверить путь к делу класса InvestigationResultStatusMapper по умолчанию и вызвать исключение IllegalArgumentException.Я ищу и пробую разными способами. Но большинство примеров использования powermockito. Но я хочу макито с testNg. Как я могу это проверить. Я пытаюсь это использовать,

@Test(expectedExceptions = { IllegalArgumentException.class })
  public void testMapOmResultStatusToNovaResultStatus_whenHaveDefaultValue_thenThrowIllegalArgumentException()
  {
    se.api.InvestigationResultStatus investigationResultStatusNewEnum = mock(se.api.InvestigationResultStatus.class);
    Whitebox.setInternalState(investigationResultStatusNewEnum, "name", "DEFAULT");
    Whitebox.setInternalState(investigationResultStatusNewEnum, "ordinal", "DefaultResult.rr");

    se.api.InvestigationResultStatus investigationResultStatusCosmic = mock(se.api.InvestigationResultStatus.class);

    when(investigationResultStatusCosmic.values()).thenReturn(
        new se.api.InvestigationResultStatus[] { InvestigationResultStatus.PENDING, InvestigationResultStatus.NEW,
            se.api.InvestigationResultStatus.MODIFIED, InvestigationResultStatus.FINAL, InvestigationResultStatus.PRELIMINARY,
            se.api.InvestigationResultStatus.ADDITIONAL, InvestigationResultStatus.REJECTED,
            se.api.InvestigationResultStatus.COMPLETE, InvestigationResultStatus.UNDEFINED, investigationResultStatusNewEnum });

    investigationResultStatusMapper.mapOmResultStatusToNovaResultStatus(investigationResultStatusNewEnum);
  }

Ответы [ 3 ]

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

Неправильный подход.Прежде всего, сторонний enum имеет 9 записей, но ваш собственный enum имеет только 8 .Поэтому, когда ваш код сопоставления получает COMPLETE, он выдаст это исключение!Но если в вашем собственном перечислении будет 9 записей, и вы просто отобразите их 1-1 ... какой смысл использовать ваше собственное перечисление здесь в первую очередь?(могут быть веские причины иметь его, но на данный момент это не добавляет особой ценности).

Помимо этой проблемы, вы должны сделать это совершенно по-другому:

Вы ставите эти Отображение в объект Map.Затем напишите модульные тесты, использующие InvestigationResultStatus.values() для получения массива со всеми valid InvestigationResultStatus константами.Вы убедитесь, что ваша карта знает, как отобразить все эти действительные константы (например, проверяя, что вы получаете ненулевое возвращаемое значение).Кроме того, у вас может быть один тест для каждой сторонней константы, чтобы проверить ожидаемый результат.

Ключевой момент здесь: к сожалению, перечисления могут меняться со временем.Таким образом, вы абсолютно хотите знать когда дополнительные константы добавляются в 3-е перечисление.

Другими словами: язык Java соответственно компилятор гарантирует, что не может быть "недопустимых" экземпляров.этого стороннего перечисления.Если у вас есть InvestigationResultStatus someEnumValue, то на 100% ясно, что: либо someValue равно нулю, либо это одна из констант из этого перечисления.Здесь больше ничего не возможно!Таким образом: не нужно ожидать, проверять или обрабатывать «недействительные» значения.

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

В этом я не могу смоделировать enum (последний) класс, используя mockito

 @BeforeClass
  public void setUp()
  {
    investigationResultStatusMapper = new InvestigationResultStatusMapper();
    investigationResultStatusNewEnum = PowerMockito.mock(InvestigationResultStatus.class);


    Whitebox.setInternalState(investigationResultStatusNewEnum, "name", "TEST");
    Whitebox.setInternalState(investigationResultStatusNewEnum, "ordinal", 9);

    InvestigationResultStatus[] investigationResultStatuses = Arrays
        .copyOf(InvestigationResultStatus.values(), InvestigationResultStatus.values().length + 1);
    investigationResultStatuses[investigationResultStatuses.length - 1] = investigationResultStatusNewEnum;

    PowerMockito.mockStatic(InvestigationResultStatus.class);

    PowerMockito.when(InvestigationResultStatus.values()).thenReturn(
        investigationResultStatuses);
  }

  /**
   * Test Method for {@link InvestigationResultStatusMapper#mapOmResultStatusToNovaResultStatus(InvestigationResultStatus)}
   * extend the InvestigationResultStatus enum for DEFAULT throw {@link IllegalArgumentException})
   */
  @Test(expectedExceptions = {
      IllegalArgumentException.class }, expectedExceptionsMessageRegExp = "Unknown InvestigationResultStatus: TEST")
  public void testMapOmResultStatusToNovaResultStatus_whenHaveDefaultValue_thenThrowIllegalArgumentException()
  {
    investigationResultStatusMapper.mapOmResultStatusToNovaResultStatus(investigationResultStatusNewEnum);
  }
0 голосов
/ 04 декабря 2018

Вы можете создать экземпляр напрямую, чтобы избежать насмешек.

@Test(expectedExceptions = { IllegalArgumentException.class })
public void testMapOmResultStatusToNovaResultStatus_whenHaveDefaultValue_thenThrowIllegalArgumentException()
{

  InvestigationResultStatus investigation = new InvestigationResultStatus();
  investigation.mapOmResultStatusToNovaResultStatus(-10000);
   ....

}
...