我已经写了一个 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/