【发布时间】:2015-03-05 06:27:07
【问题描述】:
关于 void 返回方法的单元测试用例有很多问题,但没有一个有令人满意的答案。在我的系统中测试 void 返回方法时,我也遇到了同样的问题。 我如何决定应该使用哪种策略来检查这些方法?在我的情况下,代码 sn-p 是这样的:
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 方法。
【问题讨论】:
-
答案和你声称不满意的所有答案都是一样的:如果方法是
void,它一定有副作用,否则毫无意义。所以你测试副作用。 为什么这是一个不令人满意的答案? -
@JonSkeet 我的猜测是因为这个exact用例还没有被勺子喂食。
-
@JonSkeet 我不同意你的观点,因为当我们在不同框架的数据库中插入一些值时,通常我们使用 void 返回类型。所以这并不意味着我的方法没有任何方面影响。在此示例中,日志记录是一项必要要求,不能不加以检查。
-
我认为你的底片太多了。将值插入数据库是一种副作用。日志记录是一种副作用。这两个都可以测试。
标签: java unit-testing junit void