简体   繁体   English

如何使用JMock在模拟方法中测试模拟方法

[英]How to use JMock to test mocked methods inside a mocked method

I'm having trouble determining how to mock a particular piece of code. 我在确定如何模拟特定代码方面遇到麻烦。

Here is my method: 这是我的方法:

public void sendNotifications(NotificationType type, Person person)
    {
        List<Notification> notifications = findNotifications(type);
        for(Notification notification : notifications)
        {
            notification.send(person);
        }
    }

I would like to be able to use JMock to test that findNotifications is called and that and returns the expected value and that send() is called. 我希望能够使用JMock来测试是否调用了findNotifications并返回了期望的值并调用了send()。

findNotifications calls my Dao which is mocked. findNotifications称我的Dao被嘲笑了。 Notification is an abstract class. 通知是一个抽象类。

I have a unit test like this, but it's obviously not working. 我有这样的单元测试,但显然不能正常工作。 It satisfies the first two expectations but no more. 它满足前两个期望,但仅此而已。

    @Test
public void testSendNotifications2()
{
    final Person person = new Person();
    notificationEntries.add(createEntry1);

    Mockery context = new JUnit4Mockery() {{ setImposteriser(ClassImposteriser.INSTANCE); }};
    final NotificationDao dao = context.mock(NotificationDao.class, "notificationDao");
    final Notification mockedNotification = context.mock(V2ADTNotification.class, "mockNotification");
    notifications.add(mockedNotification);

    final NotifierServiceImpl mockedService = context.mock(NotifierServiceImpl.class, "mockedService");

    //NotifierService service = new NotifierServiceImpl(dao);

    context.checking(new Expectations() {
        {
            one(mockedService).setDao(dao);
            one(mockedService).sendNotifications(NotificationType.CREATE, person);
            one(mockedService).findNotifications(NotificationType.CREATE);
            one(dao).getByNotificationType(NotificationType.CREATE);
            will(returnValue(notificationEntries)); 
            will(returnValue(notifications));

            one(mockedNotification).send(person);
        }
    });

    mockedService.setDao(dao);
    mockedService.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

    mockedService.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

How could I get this to work as I want it to? 我怎样才能使它按我的意愿工作?

Another way I tried. 我尝试过的另一种方式。 It satisfies the first two expectations but not the send one. 它满足前两个期望,但不满足发送期望。

@Test
public void testSendNotifications()
{
    final Person person = new Person();
    notificationEntries.add(createEntry1);

    Mockery context = new JUnit4Mockery() {{ setImposteriser(ClassImposteriser.INSTANCE); }};
    final NotificationDao dao = context.mock(NotificationDao.class, "notificationDao");
    final Notification mockedNotification = context.mock(V2ADTNotification.class, "mockNotification");

    NotifierService service = new NotifierServiceImpl(dao);

    context.checking(new Expectations() {
        {
            one(dao).getByNotificationType(NotificationType.CREATE);
            will(returnValue(notificationEntries)); 

            one(mockedNotification).send(person);
        }
    });

    service.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

I'm pretty new to using Jmock so I apologize if it doesn't look like I have much of a clue as to what I'm doing (I don't). 我对使用Jmock非常陌生,因此如果看起来不太了解我在做什么,我深表歉意(我没有)。

test mocked methods inside a mocked method. 在模拟方法中测试模拟方法。

You really just can't do that. 您真的做不到。 The calls in the real method aren't being made, because you're calling the mock instead of the real method. 不会进行real方法中的调用,因为您正在调用模拟而不是real方法。

Your first attempt fails the last two expectations because the calls that would make them pass are made only in the real implementation of sendNotifications , and not in the mock that you made of it. 您的第一次尝试未通过最后两个期望,因为使它们通过的调用仅在sendNotifications的实际实现中进行,而不是在您对它进行的模拟中进行。

The second is closer to workable, but you need to add your mockedNotification to the notificationEntries list that you've set up to be return by the mock of getByNotificationType . 第二个更接近于可行,但是您需要将您的mockedNotification notificationEntries添加到已设置为通过getByNotificationType模仿返回的notificationEntries列表中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM