2017-01-27 12 views
0

JSQLparserのVisitorを実装してSQLクエリを解析しました。コードは絶対にうまく動作しています。私はそれらの訪問者の単体テストを行う方法がわかりません。たとえば、私は、次のSQL文を持って次のようにJsqlparserで訪問者の単体テストを行う方法は?

public class StmntVisitorImpl implements StatementVisitor { 


@Override 
public void visit(Select select) { 
    LOG.debug("Begin Select visit : "+select.toString()); 
    SelectVisitor selectVisitor = new SelectVisitorImpl();  
    select.getSelectBody().accept(selectVisitor); 
    if(select.getWithItemsList()!=null && !select.getWithItemsList().isEmpty()){ 
     select.getWithItemsList().stream() 
     .forEach(wth -> wth.accept(selectVisitor));    
    }    
} 
@Override 
public void visit(Delete delete) {} 
@Override 
public void visit(Update update) {} 
@Override 
public void visit(Insert insert) {} 
@Override 
public void visit(Replace replace) {} 
@Override 
public void visit(Drop drop) {} 
} 

は、その後、私は別のクラスでそれを呼び出しています:

Select a.a1, a.a2 from foo as a 

私はStatementVisitorインタフェースを実装しているし、私のコードはこのように書き、それを解析するには

String sql = "Select a.a1, a.a2 from foo as a"; 
CCJSqlParserManager parserManager = new CCJSqlParserManager(); 
StatementVisitor statementVisitor = new StmntVisitorImpl(); 
Statement sqlStatement = parserManager.parse(new StringReader(sql)); 
sqlStatement.accept(statementVisitor); 

私は私のStmntVisitorImpl、SelectVisitorImplとJSqlparserによって与えられたビジターインタフェースを実装する他のクラスのユニットテストケースを書きたいです。私はどうすればいいのですか?

+0

あなたが期待しているものをテストしてください:)。だからあなたはクラスの継承された実装を使用して何とか(list、log、...)呼び出されたものをログすることができます。 – wumpz

+0

また、訪問者をテストするために模擬フレームワークを使用することもできます。 – wumpz

+0

実際に私は解決策を見つけました。任意のVisitorインターフェイスの実装クラスを記述している間、単純なバッファまたはコンテナオブジェクトは、そのオーバーロードされたコンストラクタ内で初期化する必要があります。これは、訪問方法のいずれかで起こっているすべての詳細を記録することができます。 – Tony

答えて

0

私のコメントに加えて、このlinkを見てください。 解決策を見つけ出すことができます。

buffer変数は、使用されている親メソッドからオーバーロードされたコンストラクタExpressionDeParserに渡すことができ、ログに記録する詳細はbufferを使用して行うことができます。

関連する問題