【问题标题】:JUnit test cases strategy for void returning methodsvoid 返回方法的 JUnit 测试用例策略
【发布时间】: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


【解决方案1】:

可能有两种方法:
1) 将其放入try catch

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

这不是很好,因为没有错误并不一定意味着一切都按预期工作。

2) 您必须阅读目的地以检查您的请求是否确实按预期记录。即具有预期值和格式。现在这也不理想,因为您编写了额外的逻辑来读取您的实际方法记录的消息,并且本身可能不正确。

所以这是你必须做出的选择。

【讨论】:

  • 1) 不需要那么复杂。只需调用logMyRequest(myRequest)。如果一个测试用例方法留下异常,它就会失败。 :)
  • Kedar 你给了我一些关于测试用例正确策略的重要线索。让我也和我的客户讨论一下,然后我会回复你。
【解决方案2】:

如果您的 Logger 正在写入默认控制台,您可以将您的 System.out Stream 重定向到字符串以验证您的打印结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多