Добавить контроллер REST / маршрут в тест SpringBoot - PullRequest
0 голосов
/ 30 мая 2019

Можно ли добавить маршрут / конечную точку (которую я не хочу включать в исходники, а скорее оставить в тестах) к тесту SpringBoot?

@RestController
class HelloAPI {
    @GetMapping("/hello")
    public String ok() {
        return "world";
    }
}

ОБНОВЛЕНИЕ : Как оказалось, дополнительная настройка не требуется - класс HelloAPI следует переместить с src/main на src/test.Вот и все.Однако он будет «видимым» для всех тестов @SpringBoot.

Таким образом, вопрос заключается в следующем: как я могу ограничить создание (регистрацию в ApplicationContext) этого компонента (HelloAPI) определенным классом тестирования?

См. Ссылку на пример проекта

Ответы [ 3 ]

1 голос
/ 08 июня 2019

Вы можете использовать @TestConfiguration для этого:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = DEFINED_PORT)
class EmbeddedApiTest {

    @Test
    void testSomething() {
        ...
    }

    @TestConfiguration
    public static class TestCfg {

        @RestController
        @RequestMapping("/test")
        public class TestApi {

            @GetMapping("/hello")
            public String hello() {
                return "Hello World!";
            }
        }
    }
 }
0 голосов
/ 08 июня 2019

Хотя я принял ответ Анатолия (который использует Java и JUnit5), я хотел бы поделиться своим кодом Kotlin (со старым добрым JUnit4):

@RunWith(SpringRunner::class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
class TestWithInnerConfigTest {
    @LocalServerPort var port: Int? = null
    @Autowired private lateinit var restTemplate: TestRestTemplate

    @Test
    fun testingMainEndpoint() {
        val url = "http://localhost:$port/helloworld"
        val resp = restTemplate.exchange(url, GET, null, String::class.java)
        assertEquals(resp.statusCode, OK)
    }

    @Test
    fun testingTestEndpoint() {
        val url = "http://localhost:$port/test"
        val resp = restTemplate.exchange(url, GET, null, String::class.java)
        assertEquals(resp.statusCode, NOT_FOUND)
    }

    companion object {
        @TestConfiguration
        class TestCfg {
            @RestController
            class TestApi {
                @GetMapping("/test") fun hello() = "Helloworld!"
            }
        }
    }
}

Хорошая вещь об использовании статического внутреннего @TestConfiguration класса в том, что он применяется только к этому файлу. Вот ссылка на полный пример .

0 голосов
/ 30 мая 2019

Вы можете добавить статический внутренний @Configuration класс, в котором настроен компонент:

@RunWith(SpringRunner.class)
... // Other test annotations
public class YourTestClass {

    @Configuration
    static class ContextConfiguration {
        @Bean
        public HelloAPI helloAPI() {
            return new HelloAPI();
        }
    }

    @Test
    public void someTest_shouldXxx() { ... }
}

И обязательно добавьте свой HelloAPI класс в /src/test вместо /src/main/.

Заметьте, однако, что (test)ApplicationContext будет уничтожен после того, как будут выполнены все тесты в классе, тем самым уничтожив и бин HelloAPI.

Если вы ищете способ предложить конечные точки для RestTemplate, привязайте MockRestServiceServer к RestTemplate вместо .

...