2011-07-01 2 views
13

EasyMock 2.5.2 및 JUnit 4.8.2 (Eclipse를 통해 실행 중)에 문제가 있습니다. 나는 비슷한 게시물을 모두 읽었지만 대답을 찾지 못했습니다. 동일한 메소드를 테스트하는 두 개의 테스트가 포함 된 클래스가 있습니다. 나는 matchers를 사용하고있다.EasyMock : java.lang.IllegalStateException : matchers가 1 개, 기록이 2 개가되었습니다.

  1. 각 테스트는 단독으로 실행될 때 통과합니다.
  2. 첫 번째 테스트는 항상 통과합니다. 파일에서 테스트 순서를 바꾸면 참입니다.

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

    이에 대한 모든 통찰력은 다음과 같습니다 두 번째 (또는 마지막) 시험은 항상 다음과 같은 오류와 함께 실패

    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); 
    } 
    

    : 여기

는 테스트 코드의 단순화 된 버전입니다 대단히 감사합니다.

덕분에, 앤

+0

어떤 라인에서 예외가 발생합니까? –

+0

죄송합니다 - 두 번째 (또는 마지막) 테스트에서 -EasyMock.expect (mockXthing.doXthing ((String) EasyMock.anyObject())).andReturn (xyz); – Anne

+0

그래, 내 답변이 그때 말하는 것 같아. –

답변

9

나는 밀접 아직 꼼꼼하게보고하지 않은,하지만이 의심 같습니다

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

anyObject()는 정규이고 당신은 그것을 재생 후 를 호출하고 있습니다. 어떤 물건을 만드는데 사용되지 않습니다. EasyMock에 을 지정하면 개체를 허용합니다. EasyMock은 여분의 일치자를 감지하지만 두 번째 테스트까지는 해를 끼치 지 않습니다. 이 시점에서 EasyMock이 기록했지만 아직 사용하지 않은 matcher의 수 (2)는 두 번째 doXthing call (1)에 대해 예상되는 매개 변수 수와 일치하지 않습니다.

매개 변수를 testCallingXthing (또는 재생 모드 인 모의)로 전달해야합니다. null을 직접 전달하거나 2과 같은 실제 값을 전달하십시오.

+0

당신이 정확합니다! 내가 게시 한 라인에서 matchers를 사용할 필요가 없었습니다. 난 그냥 실제 개체 또는 심지어 null을 전달할 수 있습니다 (실제 테스트 코드는 4 개의 매개 변수가 있습니다). 정말 고맙습니다. – Anne

2

시도 :

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

anyObject()보다 더 세련된 매처 (matcher)가 있습니다. 이를 통해 공동 작업자에 대한 유형 기반 어설 션을 만들 수 있습니다. 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()

3

(. 내 경우 2 정합 기의 예상, 4는 기록) 그렇게 실수로 호출, 같은 단위 테스트에 EasyMock에와 mockito를 혼합하는 "의미 Mockito 인수에 대한 easymock의 notNull() 메소드. 어떤 순서로 테스트가 실행될 때만 오류가 발생합니다.

+0

나는 이것이 나의 경우이기도하다고 생각한다. Mark의 대답을 시도했지만 제대로 작동하지 않았습니다. 테스트는 여전히 간헐적으로 실패합니다. 순전히 모키토 (Mockito)에서 테스트를 다시 작성하려고합니다. – xli

+0

나를 위해 나는 어썰트에서 햄크 레스트 (Hamcrest) 매터 대신에 Easymock 매처를 사용했다. 리셋을하고 올바른 순서로 재생 했더라도 기록 중이므로 다음 테스트가 실패하게됩니다. 이것은 그것을 찾는데 도움이되었습니다. – twinj

0

이 문제를 해결하려면 모의 테스트를 마친 후 mock을 재설정해야합니다. 이 문제는

입니다.
@After 
public void after(){ 
    EasyMock.reset(mockXthing) 
} 
관련 문제