[英]How to test a method invocation inside an anonymous class using mockito
[英]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
測試publishRequest
和MessageCreator
。 就個人而言,我更喜歡在構造函數中“注入”這樣的依賴關系,但是還有其他方法可以實現相同的依賴關系。 我會做這樣的事情:
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.