Тестирование Spring Boot с другим классом обслуживания - PullRequest
0 голосов
/ 22 февраля 2019

У меня довольно простой вопрос, извиняюсь, если его уже задавали.Боюсь, что я не могу использовать правильные слова, это мой первый родео со Spring.

У меня есть RestController, объявленное так:

@RestController
class TelemetryController {

    @Autowired
    lateinit var service: TelemetryService
    //...
}

с конкретной реализацией TelemetryService как таковой в нашем модуле main:

@Service
class ConcreteTelemetryService : TelemetryService {
   // some production code
}

Затем у меня есть служба, которую я хочу использовать в своем контроллере во время тестов (внутри нашего test модуля:

@Service
class TestingTelemetryService : TelemetryService {
   // some test code using local data
}

Критически, я НЕ хочу использовать Mockito для этого, как реализациютесты требуют очень специфической настройки, которая не подходит для Mockito.

Мой тест объявлен так:

@RunWith(SpringRunner::class)
@SpringBootTest
@AutoConfigureMockMvc
class HowDoInjectServiceExampleTest {

    @Autowired
    lateinit var mockMvc: MockMvc
}

Как мне получить TestingTelemetryService внутри моего контроллера в этом случае?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если ваш TestingTelemetryService находится в том же пакете, что и HowDoInjectServiceExampleTest, то вы можете просто автоматически тестировать bean-компонент, например

@RunWith(SpringRunner::class)
@SpringBootTest
@AutoConfigureMockMvc
class HowDoInjectServiceExampleTest {

    @Autowired
    lateinit var mockMvc: MockMvc

    @Autowired
    var service: TestingTelemetryService
}

, если нет, то вам нужно определить TestConfiguration и программно определить бин с именем службыи используйте его, используя @Qualifier в тесте, чтобы определить, какой компонент использовать (в вашем случае это тестовый компонент)

0 голосов
/ 22 февраля 2019

Для этого есть разные способы, но я бы рекомендовал использовать Spring Profiles.

Использовать профиль по умолчанию с конкретной реализацией.Этот компонент будет использоваться, если профиль не указан.

@Profile("default")
@Service
class ConcreteTelemetryService : TelemetryService {
   // some production code
}

Добавьте профиль "test" в реализацию теста.

@Profile("test)
@Service
class TestingTelemetryService : TelemetryService {
   // some test code using local data
}

Теперь вы можете начать свой тест с

-Dspring.profiles.active=test

Подробнее о профилях здесь:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

...