Есть много вопросов относительно модульных тестов для методов возврата 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 ответа
Если ваш регистратор пишет в консоль по умолчанию, вы можете перенаправить поток 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
Может быть 2 подхода:
1) Поместите его в try catch
try{
logMyRequest(myRequest);
assert(true);
}catch(Exception e){
e.printStackTrace();
assert(false);
}
Что не очень хорошо, потому что отсутствие ошибок не обязательно означает, что все работает так, как ожидалось.
2) Вам нужно будет прочитать пункт назначения, чтобы проверить, действительно ли ваш запрос был зарегистрирован, как ожидалось. то есть с ожидаемыми значениями и форматом. Теперь это тоже не идеально, потому что вы пишете дополнительную логику для чтения сообщения, зарегистрированного вашим фактическим методом, и само может быть неверным.
Так что это выбор, который вы должны сделать.
logMyRequest(myRequest)
. Если метод тестового примера остается с исключением, он терпит неудачу. :)
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
void
, он должен иметь побочные эффекты, иначе он бессмысленен. Итак, вы проверяете побочные эффекты. Почему это неудовлетворительный ответ?