Есть много вопросов относительно модульных тестов для методов возврата void, но ни один из них не имеет удовлетворительного ответа. Я также столкнулся с той же проблемой при тестировании метода возврата void в моей системе. Как я могу решить, какую стратегию следует использовать для проверки таких методов? В моем случае фрагмент кода выглядит следующим образом:

public class MyRequestLogger {

private static final Logger logger_request = LogManager.getLogger("requestLogger");


/**
 * @param myRequest
 */
public static void logMyRequest(MyRequest myRequest) {
    LogFormatter lf = new LogFormatter();

    lf.addField(myRequest.getVisitorId());
    lf.addField(myRequest.getRequestIdString());
    lf.addField(myRequest.getIpAddress());

    GeoLocation geoLocation = myRequest.getGeoLocation();

    if (geoLocation == null) {
        //Adding blank object to keep the logging consistent
        geoLocation = new GeoLocation();
    }

    lf.addField(geoLocation.getCountry());
    lf.addField(geoLocation.getState());
    lf.addField(geoLocation.getCity());

    lf.addField(myRequest.getWebsiteUrl());
    lf.addField(myRequest.getPage());
    lf.addField(StringUtils.join(myRequest.getCategories(), ','));
    lf.addField(myRequest.getUserAgent());
    lf.addField(StringUtils.join(myRequest.getKeywords(), ','));
    lf.addField(StringUtils.join(myRequest.getCustomParamsFromRequest(), ','));
    lf.addField(StringUtils.join(myRequest.getAdspaceIds(), ','));

    logger_request.info(lf.toString());

}   

Я должен протестировать метод logMyRequest, который также является статическим.

-2
virtual Bhoot 5 Мар 2015 в 09:27
3
Ответ такой же, как и со всеми ответами, которые вы считаете неудовлетворительными: если метод void, он должен иметь побочные эффекты, иначе он бессмысленен. Итак, вы проверяете побочные эффекты. Почему это неудовлетворительный ответ?
 – 
Jon Skeet
5 Мар 2015 в 09:34
Я предполагаю, что это потому, что его не кормили с ложечки для этого точного варианта использования.
 – 
Duncan Jones
5 Мар 2015 в 11:36
Я не согласен с вами, потому что, когда мы вставляем некоторые значения в нашу базу данных в разных фреймворках, обычно мы используем тип возвращаемого значения void. Таким образом, это не означает, что мой метод не имеет побочных эффектов. В этом примере ведение журнала является необходимым требованием, которое нельзя оставлять без проверки.
 – 
virtual Bhoot
5 Мар 2015 в 14:28
Мне кажется, у вас слишком много минусов. Вставка значения в базу данных является побочным эффектом. Ведение журнала является побочным эффектом. И то, и другое можно проверить.
 – 
Jon Skeet
5 Мар 2015 в 14:30

2 ответа

Если ваш регистратор пишет в консоль по умолчанию, вы можете перенаправить поток System.out в строку для проверки результатов печати.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
System.setOut(ps);
System.out.println("test");
String output = baos.toString();
//output should now contain "test".
//do your asserts to the output
0
Simulant 5 Мар 2015 в 12:29

Может быть 2 подхода:
1) Поместите его в try catch

    try{
            logMyRequest(myRequest);
            assert(true);
        }catch(Exception e){
            e.printStackTrace();
            assert(false);
        }

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

2) Вам нужно будет прочитать пункт назначения, чтобы проверить, действительно ли ваш запрос был зарегистрирован, как ожидалось. то есть с ожидаемыми значениями и форматом. Теперь это тоже не идеально, потому что вы пишете дополнительную логику для чтения сообщения, зарегистрированного вашим фактическим методом, и само может быть неверным.

Так что это выбор, который вы должны сделать.

0
Kedar Parikh 5 Мар 2015 в 09:43
1) не нужно быть таким сложным. Просто вызовите logMyRequest(myRequest). Если метод тестового примера остается с исключением, он терпит неудачу. :)
 – 
nrainer
5 Мар 2015 в 10:38
Кедар, вы дали мне важную подсказку относительно правильной стратегии для тестового примера. Позвольте мне обсудить это с моим клиентом, а затем я свяжусь с вами.
 – 
virtual Bhoot
5 Мар 2015 в 14:31