ParameterResolver를 사용하여 JUnit 5에 여러 확장 값을 삽입하는 방법

아담 허 비츠

ParameterResolver 패턴을 사용하여 여러 값을 테스트에 어떻게 주입 할 수 있습니까?

반환 값은 하나만 정의 할 수있는 것 같습니다.

현재 getStore는를 사용하여 매개 변수로 삽입 된 확장 값을 저장합니다 ParameterResolver. 이 예제에서는 TestCoroutineDispatcher로컬 JUnit 테스트에서 Coroutine 라이프 사이클을 관리하기 위해 주입됩니다. 동일한 확장에서 두 번째 값을 삽입해야하는 경우에는 어떻습니까?

이행

Test.kt

@ExtendWith(LifecycleExtensions::class)
// The TestCoroutineDispatcher is injected here as a parameter.
class FeedLoadContentTests(val testDispatcher: TestCoroutineDispatcher) {

    private val contentViewModel = ContentViewModel()
    private fun FeedLoad() = feedLoadTestCases()

    @ParameterizedTest
    @MethodSource("FeedLoad")
    fun `Feed Load`(test: FeedLoadContentTest) = testDispatcher.runBlockingTest {
        // Some testing done here.
    }
}

Extension.kt

class LifecycleExtensions : BeforeAllCallback, AfterAllCallback, BeforeEachCallback,
        AfterEachCallback, ParameterResolver {
    ...

    override fun beforeEach(context: ExtensionContext?) {
        // Set Coroutine Dispatcher.
        Dispatchers.setMain(context?.getStore(STORE_NAMESPACE)
                ?.get(STORE_KEY, TestCoroutineDispatcher::class.java)!!)

        ...
    }

    override fun afterEach(context: ExtensionContext?) {
        // Reset Coroutine Dispatcher.
        Dispatchers.resetMain()
        context?.getStore(STORE_NAMESPACE)
                ?.get(STORE_KEY, TestCoroutineDispatcher::class.java)!!.cleanupTestCoroutines()

        ...
    }

    override fun supportsParameter(parameterContext: ParameterContext?,
                                   extensionContext: ExtensionContext?) =
            parameterContext?.parameter?.type == TestCoroutineDispatcher::class.java

    override fun resolveParameter(parameterContext: ParameterContext?,
                                  extensionContext: ExtensionContext?) =
            TestCoroutineDispatcher().apply {
                extensionContext?.getStore(STORE_NAMESPACE)?.put(STORE_KEY, this)
            }
}
아담 허 비츠

@Slaw 통찰력에 감사드립니다 !

음, #supportsParameter 및 #resolveParameter는 메서드의 각 매개 변수에 대해 호출됩니다. 따라서 현재 매개 변수 유형이 TestCoroutineDispatcher인지 확인하는 테스트가 있습니다. 즉, 공유 된 ViewModel 유형에 대한 테스트를 추가 할 수 있습니다. 그런 다음 유형에 따라 올바른 매개 변수를 해결하십시오. 여러 테스트에서 ViewModel을 공유하려면 부모 / 루트 ExtensionContext.Store에 참조를 저장할 수 있습니다.

Test.kt

@ExtendWith(LifecycleExtensions::class)
// The TestCoroutineDispatcher is injected here as a parameter.
class FeedLoadContentTests(val testDispatcher: TestCoroutineDispatcher, val contentViewModel: ContentViewModel) {

    private fun FeedLoad() = feedLoadTestCases()

    @ParameterizedTest
    @MethodSource("FeedLoad")
    // Injected testDispatcher used here.
    fun `Feed Load`(test: FeedLoadContentTest) = testDispatcher.runBlockingTest {
        // Some testing done here.
        // Injected contentViewModel used here.
    }
}

Extension.kt

class LifecycleExtensions : BeforeAllCallback, AfterAllCallback, BeforeEachCallback,
        AfterEachCallback, ParameterResolver {

    override fun beforeEach(context: ExtensionContext?) {
        // Set Coroutine Dispatcher.
        Dispatchers.setMain(context?.root
                ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
                ?.get(TEST_COROUTINE_DISPATCHER_KEY, TestCoroutineDispatcher::class.java)!!)

        // Set ViewModel
        context?.root
                ?.getStore(VIEWMODEL_NAMESPACE)
                ?.get(CONTENT_VIEWMODEL_KEY, ContentViewModel::class.java)!!

        // Set LiveData Executor.
        ArchTaskExecutor.getInstance().setDelegate(object : TaskExecutor() {
            override fun executeOnDiskIO(runnable: Runnable) = runnable.run()
            override fun postToMainThread(runnable: Runnable) = runnable.run()
            override fun isMainThread(): Boolean = true
        })
    }

    override fun afterEach(context: ExtensionContext?) {
        // Reset Coroutine Dispatcher.
        Dispatchers.resetMain()
        context?.root
                ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
                ?.get(TEST_COROUTINE_DISPATCHER_KEY, TestCoroutineDispatcher::class.java)!!
                .cleanupTestCoroutines()

        // Clear LiveData Executor
        ArchTaskExecutor.getInstance().setDelegate(null)
    }

    override fun resolveParameter(parameterContext: ParameterContext?,
                                  extensionContext: ExtensionContext?) =
            if (parameterContext?.parameter?.type == TestCoroutineDispatcher::class.java)
                getTestCoroutineDispatcher(extensionContext).let { dipatcher ->
                    if (dipatcher == null) saveAndReturnTestCoroutineDispatcher(extensionContext)
                    else dipatcher
                }
            else getViewModel(extensionContext).let { viewModel ->
                if (viewModel == null) saveAndReturnContentViewModel(extensionContext)
                else viewModel
            }

    private fun getTestCoroutineDispatcher(context: ExtensionContext?) = context?.root
            ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
            ?.get(TEST_COROUTINE_DISPATCHER_KEY, TestCoroutineDispatcher::class.java)

    private fun saveAndReturnTestCoroutineDispatcher(extensionContext: ExtensionContext?) =
            TestCoroutineDispatcher().apply {
                extensionContext?.root
                        ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
                        ?.put(TEST_COROUTINE_DISPATCHER_KEY, this)
            }

    private fun getViewModel(context: ExtensionContext?) = context?.root
            ?.getStore(VIEWMODEL_NAMESPACE)
            ?.get(CONTENT_VIEWMODEL_KEY, ContentViewModel::class.java)

    private fun saveAndReturnContentViewModel(extensionContext: ExtensionContext?) =
            ContentViewModel().apply {
                extensionContext?.root
                        ?.getStore(VIEWMODEL_NAMESPACE)
                        ?.put(CONTENT_VIEWMODEL_KEY, ContentViewModel())
            }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python에서 키를 사용하여 사전의 값을 확장하는 방법

분류에서Dev

PostgreSQL에서 함수를 사용하여 여러 행을 삽입하는 방법

분류에서Dev

저장 프로 시저를 사용하여 mysql에서 값을 선택하고 삽입하는 방법

분류에서Dev

PQputCopyData를 사용하여 여러 행을 삽입하는 방법

분류에서Dev

PHP를 사용하여 데이터베이스의 단일 열에 여러 확인란 값을 삽입하는 방법

분류에서Dev

Android에서 사용자 정의 어댑터를 사용하여 여러 값을 확인하는 방법

분류에서Dev

C #을 사용하여 mysql에 여러 행을 삽입하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

codeigniter에서 동일한 이름의 여러 입력을 사용하여 데이터를 삽입하는 방법

분류에서Dev

JQuery를 사용하여 여러 확인란의 값을 URL에 전달하는 방법

분류에서Dev

jquery를 사용하여 양식에서 여러 동적 라디오 버튼의 값을 확인하는 방법

분류에서Dev

for 루프를 사용하여 변수에 저장된 여러 값을 인쇄하는 방법

분류에서Dev

json을 사용하여 solr 업데이트에서 한 번에 여러 인덱스를 삽입하는 방법

분류에서Dev

여러 SqlDataAdapter 삽입에 DataTable을 재사용하는 방법

분류에서Dev

Django orm을 사용하여 여러 테이블에 데이터를 삽입하는 방법

분류에서Dev

PHP를 사용하여 데이터베이스의 json 배열에 여러 줄을 삽입하는 방법

분류에서Dev

Jquery를 사용하여 확인란에서 여러 값을 가져 오는 방법

분류에서Dev

makefile을 사용하여 확장없이 변수를 에코하는 방법

분류에서Dev

JUnit 5 확장에 값을 저장하고 매개 변수화 된 테스트에 주입하는 방법

분류에서Dev

PHP를 사용하여 MySQL에 JS 배열을 삽입하는 가장 쉬운 방법

분류에서Dev

여러 foreach를 사용하여 MYSQL에 올바르게 삽입하는 방법

분류에서Dev

postgres를 사용하여 열에 여러 값을 표시하는 방법

분류에서Dev

나중에 html에서 사용하기 위해 javascript를 사용하여 입력 값을 저장하는 방법

분류에서Dev

Spring Boot CRUD API를 사용하여 하나의 POST 끝점을 사용하여 여러 테이블에 데이터를 삽입하는 방법

분류에서Dev

SimpleCursorAdapter를 사용하여 Listview 행을 확장하는 방법

분류에서Dev

PHP와 mysql을 사용하여 생성 된 행 값에 여러 jquery를 데이터베이스에 삽입하는 방법은 무엇입니까?

분류에서Dev

여러 값을 삽입하는 방법

분류에서Dev

Magento에서 여러 매장 ID를 사용하여 매장 이름을 얻는 방법은 무엇입니까?

분류에서Dev

mysqli를 사용하여 테이블의 특정 필드에 여러 값을 삽입하는 방법은 무엇입니까?

분류에서Dev

getopts를 사용하여 삽입 된 값을 사용하는 방법

Related 관련 기사

  1. 1

    Python에서 키를 사용하여 사전의 값을 확장하는 방법

  2. 2

    PostgreSQL에서 함수를 사용하여 여러 행을 삽입하는 방법

  3. 3

    저장 프로 시저를 사용하여 mysql에서 값을 선택하고 삽입하는 방법

  4. 4

    PQputCopyData를 사용하여 여러 행을 삽입하는 방법

  5. 5

    PHP를 사용하여 데이터베이스의 단일 열에 여러 확인란 값을 삽입하는 방법

  6. 6

    Android에서 사용자 정의 어댑터를 사용하여 여러 값을 확인하는 방법

  7. 7

    C #을 사용하여 mysql에 여러 행을 삽입하는 가장 좋은 방법은 무엇입니까?

  8. 8

    codeigniter에서 동일한 이름의 여러 입력을 사용하여 데이터를 삽입하는 방법

  9. 9

    JQuery를 사용하여 여러 확인란의 값을 URL에 전달하는 방법

  10. 10

    jquery를 사용하여 양식에서 여러 동적 라디오 버튼의 값을 확인하는 방법

  11. 11

    for 루프를 사용하여 변수에 저장된 여러 값을 인쇄하는 방법

  12. 12

    json을 사용하여 solr 업데이트에서 한 번에 여러 인덱스를 삽입하는 방법

  13. 13

    여러 SqlDataAdapter 삽입에 DataTable을 재사용하는 방법

  14. 14

    Django orm을 사용하여 여러 테이블에 데이터를 삽입하는 방법

  15. 15

    PHP를 사용하여 데이터베이스의 json 배열에 여러 줄을 삽입하는 방법

  16. 16

    Jquery를 사용하여 확인란에서 여러 값을 가져 오는 방법

  17. 17

    makefile을 사용하여 확장없이 변수를 에코하는 방법

  18. 18

    JUnit 5 확장에 값을 저장하고 매개 변수화 된 테스트에 주입하는 방법

  19. 19

    PHP를 사용하여 MySQL에 JS 배열을 삽입하는 가장 쉬운 방법

  20. 20

    여러 foreach를 사용하여 MYSQL에 올바르게 삽입하는 방법

  21. 21

    postgres를 사용하여 열에 여러 값을 표시하는 방법

  22. 22

    나중에 html에서 사용하기 위해 javascript를 사용하여 입력 값을 저장하는 방법

  23. 23

    Spring Boot CRUD API를 사용하여 하나의 POST 끝점을 사용하여 여러 테이블에 데이터를 삽입하는 방법

  24. 24

    SimpleCursorAdapter를 사용하여 Listview 행을 확장하는 방법

  25. 25

    PHP와 mysql을 사용하여 생성 된 행 값에 여러 jquery를 데이터베이스에 삽입하는 방법은 무엇입니까?

  26. 26

    여러 값을 삽입하는 방법

  27. 27

    Magento에서 여러 매장 ID를 사용하여 매장 이름을 얻는 방법은 무엇입니까?

  28. 28

    mysqli를 사용하여 테이블의 특정 필드에 여러 값을 삽입하는 방법은 무엇입니까?

  29. 29

    getopts를 사용하여 삽입 된 값을 사용하는 방법

뜨겁다태그

보관