测试是否正确创建了对象

时间:2016-03-24 12:28:58

标签: java unit-testing

这些天我更加关注单元测试,并且我遇到了一个我不确定如何进行良好测试的情况。

我有一个创建并返回类X对象的函数。这个X类是框架的一部分,所以我不太熟悉它的实现,我没有自由,就像我的“常规的合作者类“(我写的那些)。另外,当我传递一些参数时,我无法检查对象X是否设置为正确的参数,并且在某些情况下我无法传递mock。

我的问题是 - 如何检查此对象是否已正确创建,即检查哪些参数传递给其构造函数?当我传递模拟时构造函数抛出异常时如何避免问题?

也许我不够清楚,这是一个片段:

public class InputSplitCreator {

Table table;
Scan scan;
RegionLocator regionLocator;


public InputSplitCreator(Table table, Scan scan, RegionLocator regionLocator) {

    this.table = table;
    this.scan = scan;
    this.regionLocator = regionLocator;
}

public InputSplit getInputSplit(String scanStart, String scanStop, Pair<byte[][], byte[][]> startEndKeys, int i) {

    String start = Bytes.toString(startEndKeys.getFirst()[i]);
    String end = Bytes.toString(startEndKeys.getSecond()[i]);

    String startSalt;

    if (start.length() == 0)
        startSalt = "0";
    else
        startSalt = start.substring(0, 1);

    byte[] startRowKey = Bytes.toBytes(startSalt + "-" + scanStart);
    byte[] endRowKey = Bytes.toBytes(startSalt + "-" + scanStop);

    TableSplit tableSplit;

    try {

        HRegionLocation regionLocation = regionLocator.getRegionLocation(startEndKeys.getFirst()[i]);
        String hostnamePort = regionLocation.getHostnamePort();

        tableSplit = new TableSplit(table.getName(), scan, startRowKey, endRowKey, hostnamePort);
    } catch (IOException ex) {
        throw new HBaseRetrievalException("Problem while trying to find region location for region " + i, ex);
    }

    return tableSplit;
}

}

因此,这会创建一个InputSplit。我想知道是否使用正确的参数创建了此拆分。怎么做?

2 个答案:

答案 0 :(得分:1)

如果该类是框架的一部分,那么您不应该直接测试它,因为框架已经为您测试了它。如果仍然想要测试此对象的行为,请查看此对象将导致的原因 - 反应。更具体地说:模拟对象,让它做东西并检查受影响的对象(您可以控制)是否执行预期的行为或处于正确的状态。

有关详细信息,您可能应该使用您正在使用的框架以及您要测试的所述框架类更新您的答案

答案 1 :(得分:0)

这可能是您不应该直接测试的情况之一。据说这个对象用于某事,是吗?如果它没有正确创建,代码的某些部分会中断,不是吗?

在某些时候,您的应用程序依赖于此创建的对象以某种方式运行,因此您可以通过测试依赖于它的这些过程是否正常工作来隐式地测试它。

这可以避免将更多抽象用例与框架的内部工作方式和类型相结合。