1

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

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();

        ...
}

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

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

4

1 回答 1

1

你对结构有什么操作吗?根据操作的属性来测试事物是很常见的。如果您有一个将树展平为列表的函数和一个计算树中节点数的函数,您可以检查列表中的元素是否与树中的节点一样多。如果您有办法在树中查找特定元素,请确保您正在获取该元素。

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

测试的重点是不排除任何错误的可能性;测试的重点是在足够多的不同角度验证完整性,从而不太可能出现错误。

于 2013-06-10T11:23:34.553 回答