У меня есть приложение, которое работает с:
Spring Framework
Spring Data JPA
Для тестирования через JUnit
5 у меня есть следующее:
@Autowired
private GodRepository godRepository;
....
@Test
void classTest() {
logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godRepository));
logger.info("Target expepcted Type Class: {}", GodRepositoryDataJpaAdapter.class);
assertThat(AopUtils.getTargetClass(godRepository)).isNotNull()
.isEqualTo(GodRepositoryDataJpaAdapter.class);
}
Работает и проходит. Здесь GodRepositoryDataJpaAdapter
реализует GodRepository
.
Цель : подтвердить, что @Autowired
действительно вводил тип класса GodRepositoryDataJpaAdapter
во время выполнения, через GodRepository
тип
Пока здесь все в порядке и примерно явно для Spring Framework
Теперь о Spring Data
Существует определено следующее пользовательский interface
:
public interface GodRepositoryDataJpa extends CrudRepository<God, String> {
}
снова для тестирования
@Autowired
private CrudRepository<God, String> godCrudRepository;
...
@Test
void classTest() {
logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godCrudRepository));
logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godCrudRepository).getSuperclass());
logger.info("Target expepcted Type Class: {}", GodRepositoryDataJpa.class);
}
Он печатает:
Target (AOP) Class: class org.springframework.data.jpa.repository.support.SimpleJpaRepository
Target (AOP) Class: class java.lang.Object
Target expepcted Type Class: interface com.manuel.jordan.repository.data.jpa.GodRepositoryDataJpa
Обратите внимание, что для первой строки было напечатано SimpleJpaRepository
, это класс, сгенерированный за сценой с помощью Spring Data
Запрос : как, если возможно, получить во время выполнения тип GodRepositoryDataJpa
(мой пользовательский interface
), чтобы выполнить утверждение позже без каких-либо проблем
Примечание : если я попытаюсь:
logger.info("Target (AOP) Class: {}", Arrays.asList(AopUtils.getTargetClass(godCrudRepository).getAnnotatedInterfaces()));
logger.info("Target (AOP) Class: {}", Arrays.asList(AopUtils.getTargetClass(godCrudRepository).getAnnotatedSuperclass()));
Я получил:
Target (AOP) Class: [sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedParameterizedTypeImpl@77a0dd63]
Target (AOP) Class: [sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@543fe698]