2012-01-31 26 views
32

私は現在Mockitoフレームワークを研究中で、私はMockitoを使っていくつかのテストケースを作成しました。 しかし、私が代わりにモック(工assの.class)を呼び出すの私は@Mock@InjectMocksを使用できることを読んで - 私がする必要がある唯一のものは@RunWith(MockitoJUnitRunner.class)で私のテストクラスに注釈を付けたり@Before方法でMockitoAnnotations.initMocks(this);を使用することです。@Mockと@InjectMocksを使用する

しかし、動作しません - それは@Mockが動作しないようです! ここに私の2つのコードリビジョンがあります - 1つは注釈を使用し、もう1つはコメントなしです。

私は間違っていますか?

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 
} 

私が言ったように - この作品は素晴らしいです。 しかし、文句を言わない、以下:

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

そして、ここではReportServiceImplクラスです:

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

私は何をしないのですか?

+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がモックオブジェクトを変数に注入したのですが、数秒後にその変数を初期化しました。 !!

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(これ)を使用する必要はありません。 – 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

    こんにちはArend、遅れて申し訳ありません - あなたのコードも私のために働いています、私は@Mockアノテーションのためのworngインポートを使用しました - import org.mockito.MockitoAnnotations; import org.mockito.Mockの代わりに。 – Noam

    関連する問題