开发者

EasyMock : java.lang.IllegalStateException: 1 matchers expected, 2 recorded

开发者 https://www.devze.com 2023-03-16 14:53 出处:网络
I am having a problem with EasyMock 2.5.2 and JUnit 4.8.2 (running through Eclipse). I have read all the similar posts here but have not开发者_高级运维 found an answer. I have a class containing two t

I am having a problem with EasyMock 2.5.2 and JUnit 4.8.2 (running through Eclipse). I have read all the similar posts here but have not开发者_高级运维 found an answer. I have a class containing two tests which test the same method. I am using matchers.

  1. Each test passes when run alone.
  2. The first test always passes - this is true if I switch the order of the tests in the file.

Here is a simplified version of the test code:

private Xthing mockXthing;
private MainThing mainThing;

@Before
public void setUp() {
    mockXthing = EasyMock.createMock(Xthing.class);
    mainThing = new MainThing();
    mainThing.setxThing(mockXthing);
}

@After
public void cleanUp() {
    EasyMock.reset(mockXthing);
}

@Test
public void testTwo() {
    String abc = "abc";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("abc", testResult);
    EasyMock.verify(mockXthing);
}

@Test
public void testOne() {
    String xyz = "xyz";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("xyz", testResult);
    EasyMock.verify(mockXthing);
}

The second (or last) test always fails with the following error:

java.lang.IllegalStateException: 1 matchers expected, 2 recorded

Any insight to this would be greatly appreciated.

Thanks, Anne


I haven't looked meticulously closely yet, but this looks suspect:

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());

anyObject() is a matcher and you're calling it after the replay. It's not used to produce any object. It's used to instruct EasyMock to allow any object. EasyMock is detecting that extra matcher but it is not harmful until the second test. At that point, the number of matchers that EasyMock has recorded but hasn't yet used (2) doesn't line up with the number of parameters expected for the second doXthing call (1).

You should be passing in real parameters to testCallingXthing (or a mock that is in replay mode). Try passing in null directly, or a real value like 2.


for me this failure (in my case 2 matchers expected, 4 recorded.) meant "you are mixing easymock and mockito in the same unit test, so accidentally calling easymock's notNull() method for a mockito argument. Which causes the failure but only if the tests are run in a certain order.


Try:

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));

There are more refined matchers than anyObject(). These allow you to make type-based assertions about collaborators.

From the EasyMock documentation:

eq(X value)
Matches if the actual value is equals the expected value. Available for all primitive types and for objects.
anyBoolean(), anyByte(), anyChar(), anyDouble(), anyFloat(), anyInt(), anyLong(), anyObject(), anyShort()


You should reset mock after each test method to get rid of this problem. Adding below code will solve this problem.

@After 
public void after(){
    EasyMock.reset(mockXthing)
}
0

精彩评论

暂无评论...
验证码 换一张
取 消