|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Подскажите, почему не и инициализируется MockBean в ChildTest Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
На Junit4 делал подобное, работало ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:21 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Такое делать не надо ни в JUnit4, ни в JUnit5. При решении любых задач наследование нужно рассматривать в последнюю очередь. Проблема которую ты хочешь решить - это переиспользование настроек спринга (аннотации над классом), верно? Это делается созданием своей композитной аннотации. Что-то такое: Код: java 1. 2. 3.
А затем уже на целевом тестовом классе ставим эту новосозданную аннотацию: Код: java 1. 2. 3.
Это пример для JUnit4 ( @RunWith(SpringJUnit4ClassRunner.class) ). А вот статья о том же в JUnit5. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:39 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, У меня задача больше, чтоб приложение поднималось один раз, а все тесты работали в одном контексте ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:41 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Дак наследование тут не причем. Spring тесты всегда так и работают - контекст поднимается один раз, а тестов с этим контекстом - сколько хочешь. Для этого ничего особенного делать не надо. Контексты будут подниматься 2ой раз только если: - У них разные настройки (properties, profiles, возможно даже MockBeans) - На тестах стоит @DirtiesContext - Тесты находятся в разных Maven модулях ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:44 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, Угу спасибо, тогда наверное, что-то у себя напортачил ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:47 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Ну наследование не наследование тут все таки не логика как таковая а вопрос инициализации и главное чтобы проблема была решена. Ну это такая рекомендация чтобы расшарить единный контекст среди всех тестов использвать парент класс. Почти всегда такой же подход использую в интеграционных тестах. Вроде как спринг контекст привязан к самому классу над которым стоит SpringBootTest вот только чтобы spring не пробовал его инстациировать он должен быть abstract и в имя тоже нужно Abstract prefix добавить точно уже не помню обязательно ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 10:26 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
lleming Ну наследование не наследование тут все таки не логика как таковая а вопрос инициализации и главное чтобы проблема была решена. lleming Ну это такая рекомендация чтобы расшарить единный контекст среди всех тестов использвать парент класс. Почти всегда такой же подход использую в интеграционных тестах. llemingВроде как спринг контекст привязан к самому классу над которым стоит SpringBootTestЭто не так, тестовый спринг контекст привязан к уникальным конфигурациям среди всех тестовых классов. Т.е. если у нас есть 100 тестовых классов с одной конфигурацией и 100 с другой, то всего будет создано 2 спринговых контекста. llemingвот только чтобы spring не пробовал его инстациировать он должен быть abstract и в имя тоже нужно Abstract prefix добавить точно уже не помню обязательно ли.И это не так. Инициализирует тесты JUnit. Абстрактные классы конечно не могут быть проинициализированы, за сим JUnit не будет их трогать. Ну соответственно он не будет инициализировать и спринговый контекст. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 13:20 |
|
JUnit5 inheritance
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Такое делать не надо ни в JUnit4, ни в JUnit5. При решении любых задач наследование нужно рассматривать в последнюю очередь. Проблема которую ты хочешь решить - это переиспользование настроек спринга (аннотации над классом), верно? Это делается созданием своей композитной аннотации. Что-то такое: Код: java 1. 2. 3.
А затем уже на целевом тестовом классе ставим эту новосозданную аннотацию: Код: java 1. 2. 3.
Это пример для JUnit4 ( @RunWith(SpringJUnit4ClassRunner.class) ). А вот статья о том же в JUnit5. Мне вот не очевидно в данном случае что @ContextCongiguration создаст именно один контект и не будет создаваться новый для каждого теста. Тут по сути junit test должен увидеть аннотацию springbootrunner узнать что это junit extension передать управление/вызвать процедуру extensionа с именем теста(класса) который уже еще раз springbootrunner просканит и увидит contextconfiguration и тут он должен понять что нужно воспользовалься закэшированным контекстом. Что в данном случае будет ключем ? Но еще мне наверное следует подчеркнуть что особой выгоды не увидел через абстрактный класс и наследование делать единный контект для простых тестов. Выгода в производительноти не то чтобы значительна (в рамках пары сотен тестов). А вот в интеграционных тестах когда в тестконтейнере запускаются третьи сервисы вот тут и вопрос как расшарить поднятый сервис и связать его жизненый цикл с контекстом спринга и тестами в которых этот сервис использоваться будет. StanislavЭто не рекомендация - это просто первое что приходит в голову. Поэтому в очень многих проектах сделано именно так. Но если чуть подумать/поисследовать, то находится подход намного более удобный - собсно композитные аннотации. это не то что первое пришло в голову. Первое что пришло в голову что нужно поднятый третий сервис как то расшарить в единый контекст. Остальное детали реализации. Если прям исследовать нужно лезть в описание junit как как его extensions реализованы и как springboot extension вызывается инициализируется и привязывается в junit тесту. Но там отдельная песня за час не разобраться а времени как всегда в недостатке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2021, 17:41 |
|
|
start [/forum/topic.php?fid=59&tid=2120347]: |
0ms |
get settings: |
8ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
33ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
167ms |
get tp. blocked users: |
0ms |
others: | 290ms |
total: | 511ms |
0 / 0 |