Java 如何在Jsqlparser中对访问者进行单元测试?

Java 如何在Jsqlparser中对访问者进行单元测试?,java,unit-testing,visitor-pattern,jsqlparser,Java,Unit Testing,Visitor Pattern,Jsqlparser,我已经实现了JSqlparser的访问者来解析SQL查询。代码运行得非常好。我不知道如何为这些访问者进行单元测试。例如,我有以下sql语句: Select a.a1, a.a2 from foo as a 为了解析它,我实现了StatementVisitor接口,我的代码如下: public class StmntVisitorImpl implements StatementVisitor { @Override public void visit(Select select) {

我已经实现了JSqlparser的访问者来解析SQL查询。代码运行得非常好。我不知道如何为这些访问者进行单元测试。例如,我有以下sql语句:

Select a.a1, a.a2 from foo as a
为了解析它,我实现了StatementVisitor接口,我的代码如下:

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) {}
}
然后我在另一个类中调用它,如下所示:

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提供的访问者接口的类编写单元测试用例。我该怎么做呢?

除了我的评论之外,请看一下这个。 你可以想出解决办法


buffer
变量可以从使用它的父方法传递给
ExpressionDeParser
的重载构造函数,然后我们想要记录的任何细节都可以使用
buffer

测试您期望得到的:)。因此,您可以使用继承的类实现并以某种方式记录(列表、日志等)调用的内容。或者,您可以使用模拟框架来测试访问者。实际上,我找到了解决方案。在编写任何访问者接口的实现类时,应在其重载构造函数中初始化一个简单的缓冲区或容器对象。这可以记录任何访问方法中发生的所有详细信息。