目次
概要
Qurifier指定をしたRepositoryをDIしたContollerをテストしたときにUnsatisfiedDependencyExceptionが発生した状況と解決方法です。
(参考書籍としてKotlin Webアプリケーション──新しいサーバサイドプログラミングで写経していたときのことです)
状況
・ContollerにRepositoryをDIしており、対象のRepositoryはQualifierで指定している。
・テストクラスでQualifierの指定をしなかったため、UnsatisfiedDependencyExceptionが発生した。
その時のContollerとRepositoryは以下の通り。
TaskRepository型としつつ、QualifierでH2TaskRepositoryを指定している。
1 2 |
@Controller class TaskController(@Qualifier("h2Repository") private val taskRepository: TaskRepository) { |
1 2 3 4 5 6 |
interface TaskRepository { fun findAll(): List<Task> fun create(content: String): Task fun update(task: Task) fun findById(id: Long): Task? } |
1 2 |
@Repository class InMemoryTaskRepository : TaskRepository { |
1 2 |
@Repository("h2Repository") class H2TaskRepository(private val jdbcTemplate: JdbcTemplate) : TaskRepository { |
その時のテストクラスは以下の通り。
TaskRepository型のフィールドにQualifierが無いため例外が発生する。
1 2 3 4 5 6 7 8 9 |
@RunWith(SpringRunner::class) @WebMvcTest(TaskController::class) class TaskControllerTest { @Autowired private lateinit var mockMvc: MockMvc @MockBean private lateinit var taskRepository: TaskRepository // ← ここ |
解消方法
TaskRepository型のフィールドにQualifierが無いと例外が発生するので、フィールドにQualifierを追加してあげると解消する。
1 2 3 4 5 6 7 8 9 10 |
@RunWith(SpringRunner::class) @WebMvcTest(TaskController::class) class TaskControllerTest { @Autowired private lateinit var mockMvc: MockMvc @MockBean @Qualifier("h2Repository") // ← ここにQualifierを指定する private lateinit var taskRepository: TaskRepository |
コメント