1

次の 2 つのクラスに基づくツリーのような構造を取得しました。

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

        ...
}

しかし、ツリーが適切に構築されたことを確認するために assert ステートメントを表現する最良の方法は何だろうと思っています。

コードを改善する方法に関するその他の提案 (たとえば、質問に関係のないもの) も同様に高く評価されます。質問へのコメントにそれらを残してください。

4

1 に答える 1

1

構造上の操作はありますか?操作のプロパティに基づいて物事をテストすることは一般的です。ツリーをリストに平坦化する関数と、ツリー内のノードの数をカウントする関数がある場合、リストにツリー内のノードと同じ数の要素があることを確認できます。ツリー内の特定の要素を検索する方法がある場合は、その要素を取得していることを確認してください。

ツリーで動作する関数が他にある場合は、それらが満たすべき「法則」を考え出し、それらの法則をテストしてみてください。

テストのポイントは、エラーの可能性を排除することではありません。テストのポイントは、エラーが起こりそうにない十分な角度で完全性を検証することです。

于 2013-06-10T11:23:34.553 に答える