2015-05-14 94 views
0

我寫過一個螺栓和一個拓撲結構。現在我需要做一個Junit測試用例。我的實際輸入是一個Json,並且在我的幫助下,我編寫了代碼將其存儲在MySQL中。現在我需要測試我在​​方法中編寫的邏輯。那麼如何在測試用例中爲元組創建一個對象,或者是否有其他方法可以做到這一點。我附上了我的​​方法的代碼。Apache Storm Junit測試用例螺栓

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(); 
      } 
     } 
    } 
} 
+0

最佳實踐是將您的邏輯封裝到服務類中以簡化單元測試,而不是直接測試您的螺栓。然後,您可以使用LocalCluster實例創建集成測試。 – fhussonnois

回答

1

如果你想要做的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 
} 

對於這個工作,你應該在​​更改代碼一點點。從

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

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

否則,input.getFields()被調用兩次,但該測試僅用於該方法中指定一個返回值,並且因此,第二呼叫將返回null。 (作爲替代,還可以模擬到getFields()兩個電話。)

如果你不想嘲笑一切,你也可以實例化對象TupleImplTuple t = new TupleImpl(...)),並在您的測試傳遞給​​。