PowerMockito verifyNew withArguments объекта и массива объектов - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь проверить, что метод создает объект. у меня это почти работает с использованием PowerMockito.verifyNew (). withArguments (), однако, аргументы, которые передаются в конструктор, являются объектом и ArrayList объектов. результат теста: Фактические

invocationSubstitute.performSubstitutionLogic(
1,
6,
11,
13,
[au.edu.sccs.csp3105.NBookingPlanner.Person@2449cff7],
au.edu.sccs.csp3105.NBookingPlanner.Room@62da83ed,
"description"
);

Ожидаемое

invocationSubstitute.performSubstitutionLogic(
1,
6,
11,
13,
[au.edu.sccs.csp3105.NBookingPlanner.Person@40bffbca],
au.edu.sccs.csp3105.NBookingPlanner.Room@42a9a63e,
"description"
);

я вижу, что проблема в том, что объекты одного типа, но не одного и того же, есть ли способ сказать, что ожидаемый объект имеет правильный тип?

тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Planner.class, Meeting.class})

public class MonthInput {

Planner planner;

@Rule
    public final TextFromStandardInputStream systemInMock = emptyStandardInputStream();
@Rule
    public final ExpectedSystemExit exit = ExpectedSystemExit.none();

@SuppressWarnings("deprecation")
@Before
public void setup() throws Exception {
    Meeting meetingMock = Mockito.mock(Meeting.class);
    PowerMockito.whenNew(Meeting.class).withAnyArguments().thenReturn(meetingMock);     
}

@Test
public void MonthInputofless5() throws Exception {
    // make spy
    planner = Mockito.spy(Planner.class);

    //override main menu with do nothing
    Mockito.doNothing().when(planner).mainMenu();

    //provide inputs
    systemInMock.provideLines("1","6","11","13","ML13.218","Mark Colin","done","description");

    //set expected outputs
    ArrayList<Person> attendees = new ArrayList<Person>();
    attendees.add(new Person("Mark Colin"));
    Room where = new Room("ML13.218");

    //call the method
    planner.scheduleMeeting();

    //set passing terms     
    PowerMockito.verifyNew(Meeting.class).withArguments(1,6,11,13,attendees,where,"description");

}

1 Ответ

0 голосов
/ 15 мая 2018

Исправьте ваш код

Проверочное простое исправление в ваших классах: внедрите hashCode и equals в Person и Room, чтобы при проверке Powermock фактически можно было сравнивать два объекта на равенство, а не просто полагаться на ссылку на объект.

Исправьте ваши тесты

Если вы не хотите исправлять свой код, но тестировать, вы можете использовать средство сопоставления Mockito (т.е. org.mockito.Matchers.eq или org.mockito.Matchers.any). Но учтите, что eq зависит от equals и не будет работать, если вы не реализуете его (см. Выше). Но any будет соответствовать любому объекту этого типа (удивительно!)

PowerMockito.verifyNew(Meeting.class)
            .withArguments(eq(1),eq(6),eq(11),eq(13), 
                          any(List.class),
                          any(Room.class),
                          eq("description"));

Если фактическое значение имеет значение, вы можете использовать ArgumentCapture вместо сопоставителя и проверить захваченное значение.

Теоретически , должно выглядеть так:

final ArgumentCaptor<Person> personCaptor = forClass(Person.class);
final ArgumentCaptor<Room> roomCaptor = forClass(Room.class);
 PowerMockito.verifyNew(Planner.class)
             .withArguments(eq(1),eq(6),eq(11),eq(13), 
                  personCaptor.capture(), 
                  roomCaptor.capture(), 
                  eq("description"));

    final Person passedParam = personCaptor.getValue();
    //do your comparison here

Но я не запустил пример захвата, так что, возможно, это возможно только с простым Mockito.

Только не надо!

Все, что сказано, вы должны проверить свой общий подход. Использование Whitebox-Testing может создать очень хрупкие тесты и не сильно поможет в рефакторинге, а также может способствовать развитию плохого класса.

Неосторожное использование Powermockito - это anti-pattern . Это очень мощный инструмент для тестирования непроверенного, то есть плохо разработанного унаследованного кода из средневековья Интернета, где домашние страницы были созданными вручную HTML-кодами и полными шатких GIF-файлов. Не используйте его для новых, новых проектов. Просто не надо.

Вместо этого попробуйте сосредоточиться на наблюдаемом результате любого действия. Вызов метода scheduleMeeting() может привести к любому результату, который легче проверить - важен результат, а не способ их получения. Поверьте мне, ни один пользователь не становится счастливее, когда вызывается конструктор.

Результаты могут быть

  • экземпляр собрания (в качестве возвращаемого значения это будет лучше всего в вашем примере)
  • изменение состояния в планировщике (есть получатели?)
  • изменение состояния в нисходящем сервисе / дБ
  • письменный файл
  • вывод, записанный в System.out
...