如何单元测试构建复杂的结构

时间:2013-06-10 11:03:06

标签: unit-testing data-structures

我有一个基于以下两个类的树状结构:

public class SchemaNode 
{
    private SchemaNode parentNode;
    private String elementName;
    private List<Edge> edges;

    /* constructors, getters/setters, etc. omitted to improve brevity */
}

public class Edge 
{
    private int minCardinality;
    private int maxCardinality;
    private SchemaNode targetNode;

    /* constructors, getters/setters, etc. omitted to improve brevity */
}

我还创建了一个构建器来简化树的生成:

public class SchemaTreeBuilder 
{
    private SchemaNode result;
    private SchemaNode currentNode;

    public SchemaTreeBuilder(String nodeName) {
        result = new SchemaNode(nodeName);
        currentNode = result;
    }

    public SchemaTreeBuilder addEdge(int minCardinality, int maxCardinality, String elementName) 
    {
        SchemaNode targetNode = new SchemaNode(elementName, currentNode);
        Edge edge = new Edge(minCardinality, maxCardinality, targetNode);
        currentNode.addEdge(edge);

        currentNode = targetNode;

        return this;
    }

    public SchemaTreeBuilder addEdge(String elementName) {
        this.addEdge(1, 1, elementName);
        return this;
    }

    public SchemaTreeBuilder up() 
    {
        SchemaNode parentNode = currentNode.getParent();

        if (parentNode == null) {
            throw new IllegalStateException("Called up on a root node.");
        }

        currentNode = parentNode;

        return this;
    }

    public SchemaNode getResult() {
        return result;
    }
}

现在我想写一些单元测试以确保构建器正常工作。我创建了以下测试开头:

@Test
public void buildsABasicSchemaTree() 
{
    SchemaNode tree = 
        new SchemaTreeBuilder("is")
            .addEdge(1, 1, "people")
                .addEdge(0, 100, "person")
                    .addEdge(1, 1, "id")
                .up()
                    .addEdge(1, 1, "name")
                .up()
            .up()
        .up()
            .addEdge(1, 1, "courses")
                .addEdge(1, 10, "course")
                    .addEdge(1, 1, "id")
                .up()
                    .addEdge(1, 1, "teacher_id")
                .up()
                    .addEdge(1, 1, "students")
                        .addEdge(1, 30, "student_id")
        .getResult();

        ...
}

但我想知道表达断言语句的最佳方式是什么,以确保树构建正确。

关于如何改进代码(例如与问题无关)的任何其他建议也受到赞赏。请留下他们对问题的评论。

1 个答案:

答案 0 :(得分:1)

您对结构有任何操作吗?通常基于其操作的属性来测试事物。如果您有一个将树展平为列表的函数和一个计算树中节点数的函数,则可以检查列表中的元素是否与树中的节点一样多。如果您有办法在树中查找特定元素,请确保返回该元素。

如果您在树上运行任何其他功能,请尝试提出他们应该满足的“法律”并测试这些法律!

测试的目的不是排除任何错误的可能性;测试的目的是以足够的不同角度验证完整性,以确定错误。

相关问题