2013-04-10 42 views
1

我正在寫用TestNG和Mockito.The問題單元箱子匿名類對象,我面臨與下面給出的方法:如何測試內部方法

public void publishRequest(final NotificationRequest request){ 

    MessageCreator messageCreator = new MessageCreator() { 

     @Override 
     public Message createMessage(Session session) throws JMSException { 
      if (logger.isDebugEnabled()) { 
       logger.debug("Start of MessagePublisher publishRequest"); 
      } 
      ObjectMessage msg = session.createObjectMessage(); 

      msg.setStringProperty(
        "SELECTOR", 
        request.getAvailaibilityTier() + "-" 
          + request.getEsbReference()); 

      if (logger.isDebugEnabled()) { 
      logger.debug("Message Selector=>"+msg.getStringProperty("SELECTOR")); 
      } 

      msg.setStringProperty(NotificationConstants.CACHE_KEY.name(), 
        request.getId()); 

      msg.setObject(request.getData()); 
      if (logger.isDebugEnabled()) { 
       logger.debug("Publishing request -->" + request); 
      } 

      if (logger.isDebugEnabled()) { 
       logger.debug("End of MessagePublisher publishRequest"); 
      } 
      return msg; 
     } 
    }; 
    producerTemplate.send(messageCreator); 
} 

在寫單元殼體的CreateMessage( )方法沒有被調用,即使我的測試用例創建了MessageCreater對象。我想在我的單位情況下也包括這一點,以獲得更好的報道。任何想法如何測試內部類的方法?

+0

你的測試看起來像什麼?你想表達什麼? – NilsH 2013-04-10 05:06:58

回答

0

如果您覺得需要測試匿名類的行爲,請將其移至publishRequest方法之外,請將其設置爲包含publishRequest方法的類中的頂級類或靜態類。

4

有人可能會認爲,任何內部類都是publishRequest方法的實現細節。在進行單元測試時,您可以通過測試合同publishRequest而不是內部實現來獲得更強大的測試。正如@vtheron建議的那樣,爲了測試你的MessageCreator,你必須將它解壓到它自己的類中。但除此之外,考慮在你的課堂中「注入」對你的MessageCreator的引用。這樣,您可以單獨測試publishRequestMessageCreator。就個人而言,我更喜歡在構造函數中「注入」這樣的依賴關係,但還有其他方法可以實現。我會做這樣的事情:

public class MyClass { 
    private MessageCreator messageCreator; 

    public MyClass(MessageCreator messageCreator) { 
     this.messageCreator = messageCreator; 
    } 

    public void publishRequest(final NotificationRequest request) { 
     producerTemplate.send(messageCreator); 
    } 
} 

然後,你可以簡單地發送一個「模擬」 MessageCreator到您的類在測試:

public class MyTest { 

    @Test 
    public void testPublish() { 
     MessageCreator mock = new MessageCreator() { // Mock impl (or use a mock library)}; 
     MyClass classToTest = new MyClass(mock); 
     classToTest.publishRequest(notificationRequest); 
     // Do assertions and verify 
    } 
} 

它仍然在測試您的publishRequest方法的內部(測試void方法傾向於),但是如果您可以制定合同,如

當請求發佈時,消息應發送到隊列

而不是

publishRequest應該創造一個讓MessageCreator並創建一個由生產者

至少你有一個更抽象的方式發送到編寫測試,這definetively消息將影響您長期編寫測試的方式。