Когда вы используете аннотацию @Autowired
, в основном вы сопоставляете переменную с объектом, который существует в контексте приложения. Помните, что контекст приложения создается при запуске приложения весенней загрузки. Все классы с аннотацией @Service
, @Repository
, @Component
создаются в контексте приложения.
Я предполагаю, что SampleRepository
имеет одну из следующих аннотаций: @Service
, @Repository
@Component
@Repository
. И когда вы запускаете приложение весенней загрузки, создается контекст приложения и создается экземпляр класса SampleRepository
.
Аннотация @Autowire
сопоставит объект, созданный в контексте приложения, с переменной, которая имеет аннотация @Autowire
.
Причина, по которой он не работает в вашем тесте, заключается в том, что объект класса SampleRepository
не существует. И вы не можете сопоставить его с переменной, которую вы аннотировали @Autowire
.
. Это можно исправить двумя способами:
- Первое решение - создать контекст приложения, когда Вы запускаете тестовый класс. Я предлагаю не загружать весь контекст приложения со всеми объектами, которые были созданы. Будет лучше загрузить только ту часть контекста приложения, которая необходима в вашем тестовом классе.
@EnableConfigurationProperties(SampleRepository.class)
public class TestConfiguration {
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = { TestConfiguration.class })
public class SampleServiceTest{
}
Второе решение - изменить аннотацию
@DataMongoTest
, как показано ниже:
@DataMongoTest(includeFilters = @Filter(Service.class))
//or
@DataMongoTest(includeFilters = @Filter(Component.class))
Использование аннотации @DataMongoTest
отключит полную автоконфигурацию и вместо этого будет применять только конфигурацию, относящуюся к тестам MongoDB. Таким образом, классы, отмеченные @Services
, Component
, не создаются. includeFilters
- это набор фильтров, которые можно использовать для добавления фильтрованных bean-компонентов в контекст приложения.
Я подозреваю, что вы аннотировали класс SampleRepository
аннотацией @Service
или @Component
, и это почему он не создал экземпляр класса SampleRepository
.
Я посмотрел ваш код в git репо и изменил, как показано ниже:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class BusinessOwnerServiceTest {
@Autowired
private BusinessOwnerService businessOwnerService;
@Autowired
private BusinessOwnerRepository businessOwnerRepository;
@Test
public void shouldCreateNewBusinessOwner(){
businessOwnerService.findBusinessOwnerByEmail("EMAIL@gmail.com");
}
}
Ниже приведен результат:
Ниже приведено второе решение:
@RunWith(SpringJUnit4ClassRunner.class)
@DataMongoTest(includeFilters = @Filter(Service.class))
public class BusinessOwnerServiceTest {
@Autowired
private BusinessOwnerService businessOwnerService;
@Autowired
private BusinessOwnerRepository businessOwnerRepository;
@Test
public void shouldCreateNewBusinessOwner(){
businessOwnerService.findBusinessOwnerByEmail("EMAIL@gmail.com");
}
}
Ниже приводится результат второго решения: