Skip to content

Проблем при тестовете с @WithMockUser #44

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
rado-bochukov opened this issue Dec 7, 2023 · 4 comments
Closed

Проблем при тестовете с @WithMockUser #44

rado-bochukov opened this issue Dec 7, 2023 · 4 comments

Comments

@rado-bochukov
Copy link

Привет , Лъчо!

Имам проблем при интеграционните тестове!

Опитвам се да тествам създаването на Портфолио проект, про което ми е нужно да подам принципала от контролера в сървиса за да мога да го посоча като автор.
В тестовете обаче, въпреки че моквам принципал вече доста пъти ми гърми с NullPointerException че не го намира.
В секюритъ контекста съм настроил то този урл да имат достъп само юзъри, които са с роля "ARTIST" , но не мисля че това е проблема в момента.
Можеш ли да погледнеш и да разбереш от къде идва този null и как бих могъл да подам коректно принципал в тестовете.

Прилагам скрийншот . Мисля ,че по лесно ще даде представа. А линк към проекта е :->
https://github.com/rado-bochukov/archviz-arena/blob/main/src/test/java/com/example/archvizarena/web/ProjectUploadControllerTest.java

Благодаря!

tests

@luchob
Copy link
Owner

luchob commented Dec 7, 2023

Здравей!

Ще ти дам една бърза подсказка, т.к. не мога повече в момента :-) Имаш WithMockUser+@AuthenticationPrincipal ArchVizArenaUserDetails.

Това няма как да сработи, т.к. спринг тест не би могъл да знае как да превърне UserDetails-а който е създал с WithMockUser точно в ArchVizArenaUserDetails, а не например в LuchoUserDetails или нещо дружо. И... инжектира null. Затова има една друга анотация - WithUserDetails. Документацията е ето тук.

Ето какво пише: "While @WithMockUser is a very convenient way to get started, it may not work in all instances. For example, it is common for applications to expect that the Authentication principal be of a specific type. "

Надявам се това да помогне, ако не отвори наново issue-то.

Поздрави,
Л.

@luchob luchob closed this as completed Dec 7, 2023
@rado-bochukov
Copy link
Author

Добро утро, Лъчо!

Благодаря за разясненията.
Докато се мъчих сам вчера бях минал и през това , но не ми разпознаваше userDetailsServiceBeanName-a. СЛед твоя отговор задълбах малко повече и с помощта и на гпт-то разбрах, че трябва да направя TestConfig клас в който да добавя като Bean ArchVizArenaUserDetailsService.

Вече го разпознава, но сега изскача друг проблем- въпреки че съм задал в @beforeeach да създава юзър, който да ползвам за принципал . всеки път теста гърми, защото не го намира в базата.
Много лошо е това, защото в повечето от методите в контролерите ми е нужен принципала и ми връзва ръцете в момента .
Според мен правя грешка някъде в подаването на UserRepository. Въпреки че @Autowired би трябвало да се погрижи да е едно репозитори навсякъде. При дебъг виждам че сейфа юзъра в репозиторито, но дойде ли момента на теста не го намира.

Ето линк към TestConfig-> https://github.com/rado-bochukov/archviz-arena/blob/main/src/test/java/com/example/archvizarena/testConfig/TestConfig.java
A това е линк към класа за тестване-> https://github.com/rado-bochukov/archviz-arena/blob/main/src/test/java/com/example/archvizarena/web/ProjectUploadControllerTest.java

test2
Благодаря отново!

@luchob luchob reopened this Dec 8, 2023
@luchob
Copy link
Owner

luchob commented Dec 8, 2023

Здрасти!

Щом гпт-то не може да отговори, тегава работа и наистина звучи много лошо ;-) Но нека опитаме...

Вече го разпознава, но сега изскача друг проблем- въпреки че съм задал в https://github.com/beforeeach да създава юзър, който да ползвам за принципал . всеки път теста гърми, защото не го намира в базата.

Тук може би вината е моя, защото прибързано ти пратих не най-последната версия на документацията. Имаше едно бъгче - spring-projects/spring-security#6591

Та хората го пооправиха и сега в последната версия на документацията е записано:

By default, the SecurityContext is set during the TestExecutionListener.beforeTestMethod event. This is the equivalent of happening before JUnit’s @before. You can change this to happen during the TestExecutionListener.beforeTestExecution event, which is after JUnit’s @before but before the test method is invoked:

@WithUserDetails(setupBefore = TestExecutionEvent.TEST_EXECUTION)

Преведено, означава че би могъл да си организираш теста по следния начин:

    @BeforeEach
    void setUp() {
        ...
        userTestDataUtil.createArtist(TEST_ARTIST_USERNAME);
        ...
    }

    @Test
    @WithUserDetails(
        value = TEST_ARTIST_USERNAME,
        userDetailsServiceBeanName = "ava",
        setupBefore = TestExecutionEvent.TEST_EXECUTION
    )
    void TestUserUploadProject() throws Exception {
       ....
    }

Поздрави,
Л.

@luchob luchob closed this as completed Dec 8, 2023
@rado-bochukov
Copy link
Author

Много, много благодарности!

Развърза ми ръцете!

Поздрави!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants