Я портированию приложения через дорогу от JDBC/REST для spring-data-rest
и мой один и только модульного тестирования с завершается с ошибкойне удалось запустить пружинными данных остальное модульное тестирование, RepositoryRestResource не доступен @Autowire
NoSuchBeanDefinitionException:
No qualifying bean of type 'com.xxx.repository.ForecastRepository' available
Приложение было ретро-оснащено spring-boot
только ранее, и теперь я пытаюсь установить новый слой на место с помощью spring-data-rest
поверх spring-data-jpa
.
Я пытаюсь выработать правильный Java-конфигурацию в соответствии с
Custom Test Slice with Spring Boot 1.4
, но я должен был отойти от идиоматического подхода, поскольку
@WebMvcTest
аннотации не подавляет защитный модуль, который вызывает сбой теста@MockMvcAutoConfiguration
не удалось из-за отсутствующих зависимостей, если не укажу@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
(см here)@WebMvcTest
и@SpringBootTest
являются взаимоисключающими, так как они оба указать@BootstrapWith
и не могут работать вместе
Так это ближайший я получил, но весна не может найти мой @RepositoryRestResource
репозиторий:
Repository
@RepositoryRestResource(collectionResourceRel = "forecasts", path = "forecasts")
public interface ForecastRepository extends CrudRepository<ForecastExEncoded,
Long> {
JUnit Test
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK,
classes = {TestRestConfiguration.class})
public class ForecastRestTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private ForecastRepository forecastRepository;
@Before
public void deleteAllBeforeTests() throws Exception {
forecastRepository.deleteAll();
}
@Test
public void shouldReturnRepositoryIndex() throws Exception {
mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk()).andExpect(
jsonPath("$._links.forecasts").exists());
}
}
Конфигурация
@OverrideAutoConfiguration(enabled = false)
@ImportAutoConfiguration(value = {
RepositoryRestMvcAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
WebMvcAutoConfiguration.class,
MockMvcAutoConfiguration.class,
MockMvcSecurityAutoConfiguration.class
})
@Import({PropertySpringConfig.class})
public class TestRestConfiguration {}
Также пробовал ...
Я пытался настроить модульного тестирования с только @WebMvcTest
и это @ComponentScan
ниже от How to exclude AutoConfiguration from Spring Boot), в попытке упростить все, однако excludeFilters
не имел ef fect.
@ComponentScan(
basePackages="com.xxx",
excludeFilters = {
@ComponentScan.Filter(type = ASSIGNABLE_TYPE,
value = {
SpringBootWebApplication.class,
JpaDataConfiguration.class,
SecurityConfig.class
})
})
Я установил протоколирование Spring для трассировки, потому что все, что я могу сделать в этой точке попытаться найти подсказки относительно того, что происходит с выхода журнала. Пока что без везения.
Я могу видеть в протоколе, что загружается RepositoryRestConfiguration, но, очевидно, он не снабжается нужной информацией, и я не могу разобраться, как это делается, после поиска в Google и добавлениях к документам Spring и API. Я думаю, что, должно быть, я прочитал каждый соответствующий вопрос здесь.
Обновление 2016-11-16 10:00
Одна вещь, которую я вижу в журналах, которые меня волнуют это:
Performing dependency injection for test context [[email protected] [snip...]
classes = '{class com.xxx.TestRestConfiguration,
class com.xxx.TestRestConfiguration}',
т.е. контекст перечисляет класс конфигурации дважды. Я указал класс конфигурации (только один раз) в аннотации @SpringBootTest#classes
. Но если я оставлю #classes
из аннотации, Spring Boot найдет и вытащит всю конфигурацию через класс @SpringBootApplication
.
Так что это намек на то, что я указываю конфигурацию в другом месте? Как еще я это сделаю?