Я думаю, вы должны понимать, что классы, отмеченные @Configuration
, на самом деле не являются java классами, или, по крайней мере, вы не должны относиться к ним так. Я знаю, это звучит неоднозначно, я объясню ...
Так что исторически Spring использовал XML конфигурации для объявления bean-компонентов.
Весной 2.5, я думаю, они ввели аннотацию на основе метод, в котором вы помещаете аннотации @Component
/ @Service
в классы, помещаете @Autowired
в любое место, куда вы хотите, чтобы spring вставляла зависимости, затем запускается Spring, сканирует путь к классам, обнаруживает компоненты и запускает контекст приложения с этими компонентами.
Затем в Spring 3.0 появился Java способ конфигурации связанных с пружиной конфигураций : @Configuration / @Bean
в специальном классе.
Таким образом, вы должны рассматривать эти классы конфигурации как " подстановка "к методам, которые я описал ранее
Теперь позвольте мне спросить, как вы думаете, вы должны протестировать и XML конфигурацию бина самостоятельно? Вероятно, нет ... Как вы думаете, вы должны проверить, что класс имеет аннотацию @Component
, и все необходимые зависимости автоматически подключены (с отражением или чем-то еще)? Наверное, нет.
Так почему вы хотите протестировать классы Java Config?
Вот еще один аргумент, который может вас заинтересовать
I Я сказал, что эти классы предназначены только для весны, чтобы разрешить бины, и он внутренне их запускает. Но Spring не просто «запускает» их - он создает оболочку времени выполнения, чтобы преодолеть некоторые технические особенности. Вот пример одной такой вещи:
Предположим, у нас есть три компонента: A, B, C, такие как B и C, зависят от A.
class A {}
class B {
private A a;
public B(A a) {this.a = a;}
}
class C {
private A a;
public C(A a) {this.a = a;}
}
Все ожидается, что bean-компоненты будут одиночными, поэтому мы определяем конфигурацию следующим образом:
@Configuration
public class MyConfig {
@Bean
public A a() { return new A(); }
@Bean
public B b() { return new B(a()); }
public C c() {return new C(a()); }
}
Обратите внимание, что мы вызываем a()
в определениях B
и C
Теперь позвольте мне задать вам вопрос: это "обычный" код java, как два разных вызова метода a()
(в конструкторах B и C), соответственно, должны возвращать один и тот же экземпляр из A
?
Так что Spring действительно использует много сложного кода, и это то, что на самом деле выполняется во время выполнения , не ваш класс как есть, а его преобразованная версия, и вы никогда не узнаете, что это за преобразования именно со своей и внутренней пружины вещь. Но так ли в чем смысл его тестировать, как есть?
Я считаю, что есть и другие аргументы, подобные этому, но суть ясна - не тестируйте классы конфигурации на их own.
Вместо этого вы можете использовать интеграционный тест, который будет запускать подпружиненный контейнер и загружать все классы, необходимые в конфигурации. Тем не менее, в этом случае вы, вероятно, захотите смоделировать некоторые классы (например, с помощью @MockBean
), чтобы тест не был на 100% точным.
С точки зрения покрытия кода - IMO, вам следует исключить эти классы из покрытия в целом