2010-08-16 4 views
19

에는 마지막 호출이 예외를 throw하지 모의 사용할 수EasyMock에 3.0, 조롱 클래스는 java.lang.IllegalStateException 예외 : java.lang.IllegalStateException : 다음 단위 테스트를 실행하는 모의 사용할 수


import org.easymock.*; 
import org.junit.*; 

public class MyTest { 

    @Test 
    public void testWithClass() { 
     Thread threadMock = EasyMock.createMock(Thread.class); 
     EasyMock.expect(threadMock.isAlive()).andReturn(true); 
    } 
} 
에는 마지막 호출을

내가 뭘 잘못하고 있는지 웹에서 좋은 예를 찾을 수 없습니다. EasyMock 3.0을 사용하여 어떻게 모의 수업을합니까? 위의 단위 테스트에 문제가 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

내 프로젝트는

<dependency> 
    <groupId>org.easymock</groupId> 
    <artifactId>easymock</artifactId> 
    <version>3.0</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>cglib</groupId> 
    <artifactId>cglib-nodep</artifactId> 
    <version>2.2</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.objenesis</groupId> 
    <artifactId>objenesis</artifactId> 
    <version>1.2</version> 
    <scope>test</scope> 
</dependency> 

답변

10

귀하의 시험 방법은 가 만든 mock 객체를 준비하지 당신이 한 것을 제외하고, 잘 보이는 다음 받는다는 종속성이 포함되어 있습니다. 이것은 당신의 JUnit을 실행에 사용되는 일이되도록 이것은 조롱 객체를 준비

EasyMock.replay(mockObject1, mockObject2, ...); 

를 사용하여 수행해야합니다. 의존성 문제도 없습니다.

또한 실제 시험 방법을 여기에서 호출하지 않는 것입니다. 일반적으로 테스트 메소드를 작성하는 방법은 테스트 메소드 컨텍스트 외부의 외부 객체가있을 때만 EasyMock 및 PowerMock과 같은 조롱 라이브러리 을 사용하여 JUnit 메소드를 작성한 다음 조롱 된 모든 객체를 재생하는 것입니다. 테스트에서 실제 비즈니스 객체를 대체 할 모의 객체). 그 후에는 테스트하려는 실제 메소드를 호출하고 org.junit.Assert.assertXXX() 메소드를 사용하여 기능의 유효성을 검사합니다.

17

이 예외의 이유는 Thread#isAlive()final 메서드이지만 EasyMock은 최종 메서드 조롱을 지원하지 않기 때문입니다. 따라서 EasyMock.expect(...) 안에 나타나는이 메서드에 대한 호출은 "모의 호출"로 간주되지 않습니다.

는 (I 개발) 등 JMockit와 같은 다른 조롱 도구를 필요 마지막 방법을 조롱 :

public void testMockingFinalMethod(@Mocked("isAlive") Thread mock) 
{ 
    new Expectations() 
    {{ 
     mock.isAlive(); result = true; 
    }}; 

    assertTrue(mock.isAlive()); 
} 

조롱 API 실제로 방법에 명시 적으로 지정되어 조롱 할 필요가 없습니다 일반적인 경우. 하지만 Thread 클래스는 까다 롭습니다.

관련 문제