AdamHurwitz
AdamHurwitz

Reputation: 10364

JUnit 5 - Parameterized Nested Tests

Expected

Creating a nested test within a parameterized test in JUnit5.

There are many conditions for the Android ViewModel using param. tests. I want to organize the tests within the param. test to improve output readability.

@ExtendWith(InstantExecutorExtension::class)
class ContentViewModelTest {

    private fun `FeedLoad`() = Stream.of(
        FeedLoadTest(isRealtime = false, feedType = MAIN, timeframe = DAY, lceState = LOADING),
        FeedLoadTest(isRealtime = false, feedType = MAIN, timeframe = DAY, lceState = CONTENT))

    @ParameterizedTest
    @MethodSource("FeedLoad")
    fun `Feed Load`(test: FeedLoadTest) {

        @Nested
        class FeedLoadNestedTest {
            @Test
            fun `all fields are included`() {
                assertThat(4).isEqualTo(2 + 2)
            }
            @Test
            fun `limit parameter`() {
                assertThat(4).isEqualTo(3 + 2)
            }
        }
        ...
    }
    data class FeedLoadTest(val isRealtime: Boolean, val feedType: FeedType,
                        val timeframe: Timeframe, val lceState: LCE_STATE)
}

Observed

The normal parameterized assertions [not depicted] work as expected. The nested FeedLoadNestedTest does not run within the Stream of parameterized FeedLoad tests.

enter image description here

Upvotes: 1

Views: 2401

Answers (1)

AdamHurwitz
AdamHurwitz

Reputation: 10364

@Sam Brannen, thanks for the feedback!

Sam has indicated on GitHub, @Nested annotation on local classes will not be a viable option.

We have no plans to support @Nested on local classes defined within the scope of a method (function in Kotlin).

Solution

Implement multiple parameterized tests that pass in the same stream.

This will allow for assertions and logic to be organized into separate parameterized functions while testing the same data passed in via the stream.

@ParameterizedTest
@MethodSource("FeedLoadStream")
fun `Feed Load Part One`(test: FeedLoadTest) {
    ...
}

@ParameterizedTest
@MethodSource("FeedLoadStream")
fun `Feed Load Part Two`(test: FeedLoadTest) {
    ...
}

@ParameterizedTest
@MethodSource("FeedLoadStream")
fun `Feed Load Part Three`(test: FeedLoadTest) {
    ...
}

Upvotes: 1

Related Questions