java - Bolt 的 Apache Storm Junit 测试用例

标签 java junit apache-storm

我已经写了一个 bolt 和一个拓扑。现在我需要做一个 Junit 测试用例。我的实际输入是 Json,在 Bolt 中我编写了代码将其存储在 MySQL 中。现在我需要测试我在 execute() 方法中编写的逻辑。那么如何为测试用例中的元组创建对象,或者是否有其他方法可以做到这一点。我已附上我的 execute() 方法的代码。

public void execute(Tuple input, BasicOutputCollector collector) {
    int size = input.getFields().size();
    Fields fields = input.getFields();
    if (size == 1) {
        logger.info("PostbackToRDSBolt execute method starts");
        try {
                eventJson = (JSONObject) JSONSerializer.toJSON((String) input.getValueByField(fields.get(0)));
                address = (String) input.getValueByField(fields.get(0));
                Id = (String) eventJson.get("Id");
                click = (String) eventJson.get("click");
                time = (String) eventJson.get("time");
                uuid = UUID.randomUUID().toString();
                type = "post";
                //Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection(
                        dBUrl, username,
                        password);
                stmt = con.createStatement();
                stmt.execute("INSERT INTO " + tableName
                        + "(id,data,type,txnid,groupname,time)values('" + uuid
                        + "','" + address + "'," + "'" + type + "','"
                        + Id + "','" + click + "','" + time
                        + "')");
                logger.info("inserted successfully in mysql");
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e1) {
                logger.info("" + e1);
                e1.printStackTrace();
            }
        }
    }
}

最佳答案

如果您想进行 JUnit 测试,一种方法是使用 Mockito 库:

例如:

@Test
public void testExecute() {
    Tuple t = mock(Tuple.class);
    when(t.getFields()).thenReturn(new Fields("myAttribute"));
    when(t.getValueByField("myAttribute").thenReturn("my json string to be tested");

    MyBolt b = new MyBolt();
    b.execute(t, mock(BasicOutputCollector.class));

    // put your assertions here
}

为此,您应该稍微更改一下 execute() 中的代码。来自

int size = input.getFields().size();
Fields fields = input.getFields();

Fields fields = input.getFields();
int size = fields.size();

否则,input.getFields() 会被调用两次,但测试仅为此方法指定一个返回值,因此第二次调用将返回 null。 (作为替代方案,您也可以模拟对 getFields() 的两次调用。)

如果您不想模拟所有内容,您还可以实例化 TupleImpl 对象 (Tuple t = new TupleImpl(...)) 并将它们传递给 execute() 在你的测试中。

关于java - Bolt 的 Apache Storm Junit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30234938/

相关文章:

Python Storm /web.py : Correctly handling DisconnectionError with MySQL database

java - DatagramSocket 关闭后端口仍在使用

java - PUT 不允许 Jersey 路径正则表达式导致方法

gwt - 在 GWTTestCase 中运行当前 Junit 测试

Java数据处理工作流框架

c++ - 如何在 Storm 和 Thrift 上使用 C++ spout/bolt 在 Storm 中使用

java - swing Drop 事件多个文件

java - 从队列中提供 Java Applet 服务?

java - 通过在命令行上指定多个 Maven 配置文件来堆叠属性

spring - mock resttemplate 交换总是返回 null