簡體   English   中英

如何在方法內部測試匿名類對象

[英]how to test anonymous class object inside method

我正在使用testNg和Mockito編寫單元案例。我面臨的問題是下面給出的方法:

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);
}

在編寫單元案例時,即使我的測試案例創建了MessageCreater對象,也不會調用createMessage()方法。 我想在單位案例中也包括在內,以獲得更好的覆蓋范圍。 任何想法如何測試內部類的方法?

可以說,內部內部類是publishRequest方法的實現細節。 在進行單元測試時,通過測試publishRequest的合同而不是內部實現,您將獲得更強大的測試。 正如@vtheron建議的那樣,要測試您的MessageCreator ,您必須將其提取到自己的類中。 但是除此之外,還要考慮在類中“注入”對MessageCreator的引用。 這樣,您可以publishRequest測試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並創建一個由生產者發送的消息

至少您有一種更加抽象的編寫測試的方法,從長遠來看,從定義上來講,這將影響您編寫測試的方式。

如果您需要測試匿名類的行為,請將其移到publishRequest方法之外,請使其成為頂層類或包含publishRequest方法的類中的靜態類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM