IllegalStateException:在同一方法中进行双重调用时缺少行为定义

时间:2016-05-26 15:01:46

标签: java unit-testing easymock

public class Holder() {

    Contact contact1;
    Contact contact2;
}

public class ContactServiceImpl() {

    public Contact create(Contact contact) {
        // do create
    }
}

public class HolderServiceImpl() {
    ContactService contactService = new ContactServiceImpl();

    public Holder createHolder(Holder holder) {
        contactService.create(holder.getContact1());
        contactService.create(holder.getContact2());

        return holder;
    }
}

pulbic class HolderServiceTest() {
    ContactServiceImpl contactService = new ContactServiceImpl();
    HolderServiceImpl holderService = new HolderServiceImpl();

    @Before
    public void setUp() {
        contactService = EasyMock.createMock(ContactServiceImpl.class);     
        holderService.setContactServiceImpl(contactService);
        EasyMock.expect(contactService.create(EasyMock.isA(Contact.class))).andReturn(new Contact()).anyTimes();
    }

    @Test
    public void testCreate() {
        Holder holder = new Holder();

        holderService.create(holder)
    }
}

当没有设置重播时,我在第二次调用contactService.create时出错,这是IllegalStateException。

然而,当添加(在期待通话后):

EasyMock.replay(contactService);

我收到此错误:

Unexpected method call ContactServiceImpl.create(Contact@4ebd441a[

我尝试过使用PowerMock,但我遇到了同样的问题。甚至可以同时进行两次调用吗?任何时候()似乎都存在这种用途,但它的工作量不大。

2 个答案:

答案 0 :(得分:0)

你从来没有把模拟放在重播状态。只需在EasyMock.replay(contactService);方法的末尾添加setUp

答案 1 :(得分:0)

Actually what was wrong is that my method testCreate was missing the setters on contact1 and contact2 which caused the error.

I had the option of either:

  1. Setting both objects
  2. Using EasyMock.isNull(Contact.class) instead of EasyMock.isA(Contact.class).

However since it was possible for in real cases to have either one of them as null, the best solution was to use EasyMock.anyObject(Contact.class) which accepts both initiated objects or nulls.

@Before
public void setUp() {
    contactService = EasyMock.createMock(ContactServiceImpl.class);     
    holderService.setContactServiceImpl(contactService);
    EasyMock.expect(contactService.create(EasyMock.anyObject(Contact.class))).andReturn(new Contact()).anyTimes();
}
相关问题