Понимание класса TestExecutionListeners и BaseTest в SpringBootTest - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь подключить несколько тестов.Мои сомнения касаются выполнения Order TestExecutionListener с родительским классом @Before и @After последовательностью выполнения для текущего запущенного Test.

Пример:

У меня есть класс, который настроил несколькофиктивный пользователь в таблице в тестовом профиле и удаляет их.Итак, я создал базовый класс для элементов, связанных с пользователем.Мой базовый класс выглядит следующим образом:

public abstract class BaseDataTest {
    @Autowired
    private UserRepository userRepository;

    private TestUserGenerator testUserGenerator;

    @Before
    public void setUp() {
        testUserGenerator = new TestUserGenerator(userRepository);
        testUserGenerator.createTestUsers();
    }

    @After
    public void cleanUp() {
        testUserGenerator.deleteTestUsers();
        testUserGenerator = null;
    }
}

Теперь у меня есть 2 сценария:

  1. Просто вставьте пользователя и позже извлеките из базы данных, чтобы число было больше, и пользователи присутствовали в тестебаза данных.
  2. Мне нужно вставить тестовых пользователей, а затем проверить конкретного пользователя и извлечь всех пользователей из таблицы blocked из текущего зарегистрированного пользователя.

Для сценария 1, которыйработает нормально, поскольку в классе Test нет аннотации TestExecutionListener, поэтому метод базового класса setUp / cleanUp вызывается правильно, и мои тесты выполняются нормально.Мой тестовый класс выглядит следующим образом:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class UserInsertTest extends BaseDataTest {

    @Autowired
    UserRepository userRepository;


    @Test
    public void testThatSystemHasUsers() {
        Assert.assertNotSame(userRepository.count(), 0);
    }

}

Для сценария 2, который не работает как, потому что у меня есть TestExecutionListener с WithSecurityContextTestExecutionListener классом в качестве значения, так как мой метод setUp не вызывается, а система не имеетпользователи доказать проверку подлинности не удается.Мой класс BlockUserTest такой, как показано ниже:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
@TestExecutionListeners(value = {WithSecurityContextTestExecutionListener.class})
public class BlockUserTest extends BaseDataTest {

    @Autowired
    private AppUserDetailsService userDetailsService;

    @Autowired
    private BlockService blockRepository;

    @Test
    @WithUserDetails(value = "sabrinahuff@comstruct.com")
    public void blockNoneReturnEmpty() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        User user = userDetailsService.loadUserByUsername(authentication.getName());
        List<Block> blockedByMe = blockRepository.getBlockedByMe(user.getId(), PageRequest.of(0, Integer.MAX_VALUE));

        Assert.assertNotNull(blockedByMe);
        //as i have not blocked anyone yet in test    
        Assert.assertSame(blockedByMe.size(), 0);
    }

}

Я получаю

    java.lang.IllegalStateException: Unable to create SecurityContext using @org.springframework.security.test.context.support.WithUserDetails(value=sabrinahuff@comstruct.com, userDetailsServiceBeanName=, setupBefore=TEST_METHOD)

    at org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener.createTestSecurityContext(WithSecurityContextTestExecutionListener.java:126)
    at org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener.createTestSecurityContext(WithSecurityContextTestExecutionListener.java:96)
    at org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener.beforeTestMethod(WithSecurityContextTestExecutionListener.java:62)
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:291)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NullPointerException
    at org.springframework.security.test.context.support.WithUserDetailsSecurityContextFactory.createSecurityContext(WithUserDetailsSecurityContextFactory.java:63)
    at org.springframework.security.test.context.support.WithUserDetailsSecurityContextFactory.createSecurityContext(WithUserDetailsSecurityContextFactory.java:44)
    at org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener.createTestSecurityContext(WithSecurityContextTestExecutionListener.java:123)
    ... 24 more


java.lang.NullPointerException
    at com.pkg.BaseDataTest.cleanUp(BaseDataTest.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

2019-05-14 13:21:23.104  INFO 17612 --- [       Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2019-05-14 13:21:23.108  INFO 17612 --- [       Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-05-14 13:21:23.109  INFO 17612 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2019-05-14 13:21:23.112  INFO 17612 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

То, что кажется допустимым, поскольку внутри принципала is null, поскольку в db нет тестовых пользователей и, следовательно, loadUserByUsernameвозвращается с нулевым значением.

Метод из org.springframework.security.test.context.support.WithUserDetailsSecurityContextFactory

public SecurityContext createSecurityContext(WithUserDetails withUser) {
        String beanName = withUser.userDetailsServiceBeanName();
        UserDetailsService userDetailsService = this.findUserDetailsService(beanName);
        String username = withUser.value();
        Assert.hasLength(username, "value() must be non empty String");
        UserDetails principal = userDetailsService.loadUserByUsername(username);
        Authentication authentication = new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        context.setAuthentication(authentication);
        return context;
    }

Сохранение TestExecutionListener и генерация моих тестовых данных, как я могу пройти мой блочный пользовательский тест.Спасибо!

Spring SecurityTest

@Test
    @WithUserDetails(value = "brysonhensley@yahoo.com")
    public void test() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Assert.assertEquals(1, 1);
    }

Кажется, это работает, и после отладки мой объект аутентификации заполняется значимыми значениями, так что UserDetailsService имя бина выбрано, я так думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...