2012-01-31 4 views
32

현재 Mockito 프레임 워크를 연구 중이며 Mockito를 사용하여 몇 가지 테스트 사례를 만들었습니다. 내가해야 할 유일한 것은 @RunWith(MockitoJUnitRunner.class) 내 테스트 클래스에 주석 또는 @Before 방법에 MockitoAnnotations.initMocks(this);을 사용하는 것입니다 - 그러나 그 다음 내가 대신 모의 (SomeClass의 .class)를 호출하는 나는 @Mock@InjectMocks을 사용할 수 있습니다 읽어 보시기 바랍니다.@Mock 및 @InjectMocks 사용

하지만 작동하지 않습니다 - @Mock이 작동하지 않는 것 같습니다! 내 2 코드 개정 - 여기에는 주석을 사용하는 것과 개정을 사용하지 않는 것이 있습니다.

내가 뭘 잘못하고 있니?

public class ReportServiceImplTestMockito { 

    private TaskService  mockTaskService; // This is the Mock object 
    private ReportServiceImpl service; 

    @Before 
    public void init(){ 
     service   = new ReportServiceImpl(); 
     mockTaskService = mock(TaskServiceImpl.class); 
     service.setTaskServiceImpl(mockTaskService); 
    } 
/// ... 

Some tests 
} 

내가 말했듯이 -이 작업은 훌륭합니다. 는 그러나 다음과 같은 습관 :

@Service 
public class ReportServiceImpl implements ReportService { 

    @Autowired 
    private TaskService taskServiceImpl; 

    public ReportServiceImpl(){} 

    public ReportServiceImpl(TaskService taskService){ 
     this.taskServiceImpl = taskService; 
    } 

    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 
} 

내가 무엇을 놓치고 : 여기

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

그리고는 ReportServiceImpl 클래스?

+0

언뜻보기에 나에게 잘 보입니다. 정확히 뭐가 잘못 됐어? –

+1

@Noam 올바른 수입을 사용하고 있습니까? – Brice

+0

David - NullPointerException이 발생합니다. 그리고 Brice, 저는 올바른 수입을 사용하고 있다고 믿습니다. 여기에 'import org.jmock.auto.Mock; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; ' – Noam

답변

24

O.K, 나는 내 실수 있어요! @InjectMocks을 사용했지만 init() 메소드에서 동일한 변수를 초기화했습니다 ... 그래서 mockito가 mock 객체를 변수에 삽입했습니다.하지만 몇 초 후에는 동일한 변수를 초기화했습니다. !! !!

3

는 잘 모르겠지만, (당신이 작업의 예에서처럼) 수동 ReportServiceImpl의 새 인스턴스를 만들려고 :

@InjectMocks 
private ReportServiceImpl service = new ReportServiceImpl(); 
+3

Mockito 1.9 이후로 더 이상 필요하지 않습니다. – Brice

+1

1.8을 사용하는 경우,'MockitoAnnotations.initMocks (this)'를 사용하지 않는 한 이니셜 라이저 또는 생성자에서 인스턴스화해야합니다.이 경우 인스턴스가 호출되기 전에 인스턴스화해야합니다. – jhericks

+3

먼저 답장을 보내 주셔서 감사합니다. @RunWith (MockitoJUnitRunner.class)를 사용 했으므로 MockitoAnnotations.initMocks (this)를 사용해야하는 것은 아닙니다. – Noam

12

귀하의 코드가 Mockito 1.9을 사용하여 나를 위해 잘 작동합니다.

Mockito의 1.8 버전을 사용하면 문제를 해결하는 방법을 정확하게 알려주는 매우 구체적인 오류 메시지가 나타납니다. php-coder가 제안한대로 : Mockito 1.8+에서는 필드를 초기화해야합니다.

이 오류 메시지 또는 다른 오류 메시지가 있었습니까?

편집 :

다음 코드는 나를 위해 작동합니다. 작은 변화 :

  • 제거 봄 주석
  • 는 인터페이스 제거
  • 추가 게터
  • 당신을 위해 오류가 발생합니까 System.out.println

  • 추가 빈 TaskService
  • 추가 테스트? :

    서비스 :

    public class ReportServiceImpl { 
    
        private TaskService taskServiceImpl; 
    
    
        public ReportServiceImpl() { 
    
        } 
    
    
        public ReportServiceImpl(TaskService taskService) { 
         this.taskServiceImpl = taskService; 
        } 
    
    
        public void setTaskServiceImpl(TaskService taskServiceImpl) { 
         this.taskServiceImpl = taskServiceImpl; 
        } 
    
    
        public TaskService getTaskServiceImpl() { 
         return taskServiceImpl; 
        } 
    } 
    

    종속성 :

    public class TaskService { 
    
    } 
    

    테스트, 인쇄 mockTaskService :

    @RunWith(MockitoJUnitRunner.class) 
    public class ReportServiceImplTestMockito { 
    
        @Mock 
        private TaskService  mockTaskService; 
    
        @InjectMocks 
        private ReportServiceImpl service; 
    
    
        @Test 
        public void testMockInjected() { 
         System.out.println(service.getTaskServiceImpl()); 
        } 
    } 
    
  • +0

    안녕하세요, 저는 Mockito 1.9도 사용하고 있습니다 ... – Noam

    +1

    제가 말했듯이이 코드는 저에게 효과적입니다. 게시 한 코드를 테스트 할 수 있습니까 (작은 변경 만)? –

    +0

    안녕하세요, 지연에 대한 미안 해요 -하지만 귀하의 코드뿐만 아니라, 나는 @ 모의 주석에 대한 worng 가져 오기를 사용했습니다 - 가져 오기 org.mockito.MockitoAnnotations; import org.mockito.Mock 대신; – Noam