web-dev-qa-db-ja.com

@Mockおよび@InjectMocksの使用

現在、Mockitoフレームワークを研究していますが、Mockitoを使用していくつかのテストケースを作成しました。しかし、それから私はmock(SomeClass。class)を呼び出す代わりにそれを読みました_@Mock_と_@InjectMocks_を使用できます-私がする必要があるのはテストに注釈を付けることだけです@RunWith(MockitoJUnitRunner.class)を含むクラス、または_@Before_メソッドでMockitoAnnotations.initMocks(this);を使用します。

しかし、それは機能しません-_@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;
    }
}
_

私は何が欠けていますか?

35
Noam

OK、間違いを見つけた!!! @InjectMocksを使用しましたが、init()メソッドで同じ変数を初期化しました...それで、mockitoが変数にモックオブジェクトを注入しましたが、数秒後にそれを実行し、同じように初期化しました変数!!!

27
Noam

Mockito 1.9を使用すると、コードが正常に機能します。

Mockitoの1.8+バージョンを使用すると、問題の修正方法を正確に示す非常に具体的なエラーメッセージが表示されます。 php-coderが示唆するように:Mockito 1.8+の場合、フィールドを初期化する必要があります。

これまたは他のエラーメッセージが表示されましたか?

編集:

次のコードは私のために機能します。小さな変更:

  • Springアノテーションを削除
  • 削除されたインターフェース
  • ゲッターを追加
  • 空のTaskServiceを追加しました
  • System.out.printlnを使用したテストを追加しました

エラーが発生しますか? :

サービス:

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

よくわかりませんが、ReportServiceImplの新しいインスタンスを手動で作成してみてください(作業例で行ったように):

 @InjectMocks 
 private ReportServiceImpl service = new ReportServiceImpl();
3
Slava Semushin