現在、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;
}
}
_
私は何が欠けていますか?
OK、間違いを見つけた!!! @InjectMocks
を使用しましたが、init()メソッドで同じ変数を初期化しました...それで、mockitoが変数にモックオブジェクトを注入しましたが、数秒後にそれを実行し、同じように初期化しました変数!!!
Mockito 1.9を使用すると、コードが正常に機能します。
Mockitoの1.8+バージョンを使用すると、問題の修正方法を正確に示す非常に具体的なエラーメッセージが表示されます。 php-coderが示唆するように:Mockito 1.8+の場合、フィールドを初期化する必要があります。
これまたは他のエラーメッセージが表示されましたか?
編集:
次のコードは私のために機能します。小さな変更:
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());
}
}
よくわかりませんが、ReportServiceImpl
の新しいインスタンスを手動で作成してみてください(作業例で行ったように):
@InjectMocks
private ReportServiceImpl service = new ReportServiceImpl();