Подтверждения или повторное использование проверки mockito - строка ошибки - PullRequest
0 голосов
/ 26 апреля 2018

У меня очень длинный тест с Mockito, и я хочу повторно использовать метод проверки с другими аргументами, чтобы тестовый код был более чистым и понятным. Вот так.

@Test
public void aggTest() throws ParseException, IOException {

    mockDataLoader();

    // This several times with different dates or hours
    testProcessSamples("2018-01-01 00:00:00 UTC");
    // ...

    // Then verify:     
    verifyDL("HOUR", "OP_DIR", "01/01/2018 00:00:00;ROA_OP-IN-B;;;;;;;;;;;;;;;;;;;");
    verifyDL("HOUR", "OP_DIR", "01/01/2018 00:00:00;ROA_OP-OUT-B;2;2;2;;;2;2;;;;;;;;;;;;");
    verifyDL("DAY", "AGG_DIR", "31/01/2018 00:00:00;ROA_AGG_Z_IN;;;;;;;;;;;;;;;;;;;");
    // About 100 lines like this ...
    verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_Y_IN;;;;;;;;ERROR;;;;;;;;;;;"); // Where the error actually is
    verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_Q_IN;;;;;;;;;;;;;;;;;;;");
    verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_M_IN;;;;;;;;;;;;;;;;;;;");        

    BDDMockito.verifyNoMoreInteractions(dataLoader);
}


private void verifyDL(String gra, String type, String csv) {
    BDDMockito.verify(dataLoader).loadData( // Where JUnit thinks the error is
            BDDMockito.argThat(new ContainsCsv(csv)),
            BDDMockito.argThat(new MatchXml(gra, type)));
}

Но тогда, когда он потерпит неудачу, JUnit, очевидно, укажет на строку BDDMockito.verify(dataLoader).loadData как точку ошибки. Мне бы хотелось, чтобы он указывал на фактическую строку в тесте, вызов verifyDL.

Полная трассировка стека есть, но мне приходится прокручивать после фактического значения и каждый раз искать нужный слой стека, вместо того, чтобы просто щелкнуть по удобному месту в моей IDE, чтобы перейти к точке ошибки.

Как вы можете видеть, я уже создал свои собственные средства сопоставления, чтобы сделать код проверки короче, но он по-прежнему не умещается в одну строку, так как для удобства обслуживания потребуется.

Есть ли способ сообщить JUnit, что verifyDL является вспомогательным методом и его следует исключить из стека?

Мне нужно что-то вроде макросов, чтобы писать меньше, и оно преобразуется в реальный код проверки.

Объяснение теста:

Я издеваюсь над сервисом более низкого уровня с именем dataLoader, затем запускаю некоторые вещи на более высоком уровне, обрабатывая некоторые входные файлы, и глубоко под этим dataLoader будет вызываться несколько раз.

После всего этого я проверяю, что вызовы dataLoader содержали данные, которые они должны были содержать.

Edit:

Я попробовал этот подход, но я все еще хочу выбрать порядок параметров в тесте, что я мог бы сделать с помощью вспомогательного метода verifyDL:

vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_XXXX_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_Y_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_XXXX_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_Y_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));     
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_XXXX_OUT;5;8;7;;;8;7;;;;;;;;;;;;"), argXml("MES", "AGG_DIR"));
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_Y_OUT;5;8;7;;;8;7;;;;;;;;;;;;"), argXml("MES", "AGG_DIR"));
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("MES", "AGG_DIR")); 

1 Ответ

0 голосов
/ 26 апреля 2018

Пожалуй, самый простой способ - просто поймать исключение, сгенерированное Mockito, и перебросить новое с более подробным сообщением. Как то так ....

@Test
public void execute_test(){
    verifyExecution("First test case","one", "two");
}


public void verifyExecution(String description, String parameter_one, String parameter_two) {
    try {
        BDDMockito.verify(mockedService).doIt(eq(parameter_one), eq(parameter_one));
    } catch (MockitoAssertionError e) {
        throw new MockitoAssertionError(String.format("Verification failed while testing case %s, with message:\n%s", description, e.getMessage()));
    }
}

Это добавляет параметр 'description' к сообщению, которое генерирует Mockito. Таким образом, вы получаете всю информацию, которую предоставляет Mockito, и добавляете к этому сценарий, который вы тестируете.

...