![](/img/trans.png)
[英]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.