#java #spring #spring-boot
#java #spring #spring-boot
Вопрос:
Я работаю над приложением на основе Spring Boot 2.3. У меня есть контроллер, который в настоящее время имеет одну автоматическую зависимость:
public class ValidationController {
private ValidationService validationService;
@Autowired
public ValidationController(ValidationService validationService) {
this.validationService = validationService;
}
}
У меня есть тесты, которые выполняются в этой службе и проходят. Я пытаюсь добавить вторую службу к этому контроллеру:
public class ValidationController {
private ValidationService validationService;
private TokenService tokenService;
@Autowired
public ValidationController(ValidationService validationService, TokenService tokenService) {
this.validationService = validationService;
this.tokenService = tokenService;
}
}
Когда я делаю это, все мои ValidationControllerTest
обращения начинают завершаться неудачей. Я нашел это сообщение в трассировке стека:
Вызвано: org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException: отсутствует соответствующий компонент типа ‘com.example.auth.service.service.Доступен токенсервис: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат на автоматическое подключение. Аннотации зависимостей: {}
Мой TokenService
интерфейс выглядит следующим образом:
public interface TokenService {
JsonWebToken getToken(User user, Account account);
}
Реализация снабжена аннотацией @Service
:
@Service
public class TokenServiceImpl implements TokenService {
private final String url;
private final String username;
private final String password;
public TokenServiceImpl(
@Value("${service.url}") String url,
@Value("${service.username}") String username,
@Value("${service.password}") String password
) {
this.url = url;
this.username = username;
this.password = password;
}
@Override
public JsonWebToken getToken(User user, Account account) {
...
return jsonWebToken;
}
}
My ValidationService
выглядит очень похоже на my TokenService
в том, что касается аннотаций, но по какой-то причине Spring Boot может найти my ValidationService
просто отлично, но my TokenService
, который находится в том же месте, нигде не найден.
Как мне убедиться, что Spring Boot может найти мой TokenService
?
Большое спасибо за комментарии!
Можете ли вы дважды проверить, что вы вызываете контекст приложения Spring в своих тестах?
Насколько я понимаю, @WebMvcTest
аннотация загрузит контекст моего приложения, это точно? У меня есть следующие аннотации к моему ValidationControllerTest
классу:
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = ValidationController.class)
Достаточно ли этого для загрузки контекста приложения в моих тестах?
Можете ли вы дважды проверить, что этот контекст выполняет сканирование компонента в пакет, в котором
TokenServiceImpl
он находится?
Я новичок в Spring Boot и все еще пытаюсь выполнить сканирование компонентов grok. У меня есть @SpringBootApplication
аннотация к моему основному AuthServiceApplication
классу, который находится в com.example.auth.service
пакете. Я прочитал о сканировании компонентов здесь:
Если другие ваши иерархии пакетов находятся ниже вашего основного приложения с
@SpringBootApplication
аннотацией, вы охвачены неявным сканированием компонентов.
Мой TokenServiceImpl
класс находится по адресу com.example.auth.service.service.impl
, что, я думаю, означает, что он находится в иерархии основного приложения, поэтому он должен быть охвачен неявным сканированием компонентов. Это точно?
Можете ли вы дважды проверить, что
ValidationService
это не издевается (с помощью аннотации @Mock или чего-то еще) где-нибудь в вашем наборе тестов?
У меня есть следующее в моем ValidationServiceImplTest
:
@MockBean
private TokenService tokenService;
Похоже, я не использую его в данный момент. Я удалю это @MockBean
и посмотрю, поможет ли это.
Комментарии:
1. Можете ли вы дважды проверить, что 1- вы вызываете контекст приложения spring в своих тестах 2 — этот контекст выполняет сканирование компонента в пакет, в котором
TokenServiceImpl
он находится 3 —ValidationService
не издевается (через@Mock
аннотацию или что-то еще) где -нибудь в вашем наборе тестов. Дополнительно: получаете ли вы дополнительные ошибки после этой трассировки стека, которая говорит о том, что что-тоTokenServiceImpl
не может быть создано (возможно, из-за отсутствия введенных@Value
файлов или чего-то еще).2. Можете ли вы опубликовать свой тестовый класс?
3. Есть ли у вас какой-либо класс @Configuration в вашем проекте. Возможно, вам нужно изменить область сканирования компонентов. Возможно, пакет Service TokenServiceImpl не сканируется