Как издеваться над условием if с помощью JUnit?

#java #junit #mocking #mockito #powermockito

#java #junit #издевательство #mockito #powermockito

Вопрос:

Я пытаюсь издеваться над методом, используя mockito. Как издеваться над условием if с помощью mockito?

Вот мой код

@Override public RemedyWrapperOutput createRemedyTicket (RemedyWrapperInput remedyWrapperInput) выдает исключение {

     logger.info("Inside createRemedyTicket");

    RemedyWrapperOutput result = new RemedyWrapperOutput();

    final RemedyRecord remData = remedyDao.getByApiAndTitle(remedyWrapperInput.getInstance(),
            remedyWrapperInput.getTitle());

    /**
     * if no records exists in the DB or if the RemedyStatus is
     * CLOSED/RESOLVED/CANCELLED, we create a new ticket.
     */
    if (remData == null ||remData.getStatus().equals(RemedyStatus.RESOLVED)
            || remData.getStatus().equals(RemedyStatus.CLOSED)|| remData.getStatus().equals(RemedyStatus.CANCELLED)) {
        createRemedyTicket(remedyWrapperInput, result);
    } else {
        /* If record exists check if its within duration */

        /**
         * If not within time range create a ticket if New and Assigned
         * status. For all other status stop processing.
         */
        if (!checkIfInTimeRange(remData.getCreationDateTime())) {

            if (remData.getStatus() != null amp;amp; (remData.getStatus().equals(RemedyStatus.NEW)
                          || remData.getStatus().equals(RemedyStatus.ASSIGNED)
                          || remData.getStatus().equals(RemedyStatus.PENDING)
                          || remData.getStatus().equals(RemedyStatus.IN_PROGRESS))) {

                   int id = remedyDao.create(createRemedyInput(remedyWrapperInput, remData));
                   callRemedyRestApi(remedyWrapperInput, result, id);
                   result.setMessage("Remedy request submitted");
            }  
        } else {
            result.setMessage("A request of this category has already been logged inside specified time range.");
        }

        // Update the last update time to current time
        remedyDao.update(remData);
    }
    return resu<
}
  

Комментарии:

1. вопрос был бы в следующем: как его реорганизовать, чтобы упростить тестирование.

Ответ №1:

Я думаю, вы хотите взглянуть на метод, который вы пытаетесь издеваться. А не содержимое метода. Позвольте мне объяснить на примере. Вот простой класс, который я хочу протестировать:

 package com.diffblue.javademo;

public class ClassToTest {

  private boolean beenChecked = false;
  private SomeDAO someDAO = new SomeDAO();

  public void checkActive(int id) {
    if (someDAO.isActive(id)) {
      beenChecked = true;
    }
  }

  public boolean getBeenChecked() {
    return beenChecked;
  }
}
  

Он вызывает SomeDAO, который я хочу издеваться:

 package com.diffblue.javademo;

public class SomeDAO {

  public  boolean isActive(int id) {
    if (id < 5) {
      return true;
    }
    return false;
  }
}
  

Когда я создаю тестовый пример, я думаю о пути, через checkActive который я хочу протестировать, а затем выбираю ответ из isActive , который будет использовать этот путь. Например:

 package com.diffblue.javademo;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Matchers;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;

import static org.mockito.Mockito.when;

public class ClassToTestTest {

  /**
   * Test the positive side of the if statement in checkActive
   */
  @PrepareForTest({SomeDAO.class})
  @Test
  public void positiveTest() throws Exception {
    // Arrange
    ClassToTest objectUnderTest = new ClassToTest();

    SomeDAO someDAO = PowerMockito.mock(SomeDAO.class);
    when(someDAO.isActive(Matchers.anyInt())).thenReturn(true);

    int activeId = 3;

    // Act
    objectUnderTest.checkActive(activeId);

    // Assert
    Assert.assertTrue(objectUnderTest.getBeenChecked());
  }
}
  

В этом случае я проверил путь, по которому оператор if (строка 6 SomeDAO) является истинным. Итак, я не издевался над оператором if, но я принудительно ввел определенный путь кода, тщательно выбрав возвращаемые значения, которые выдает Mockito.