Как смоделировать Spring SecurityContext, чтобы я мог использовать его с TestNG? - PullRequest
2 голосов
/ 07 сентября 2011

Мне нужно создать модульный тест для проверки некоторых пользовательских действий, когда они аутентифицированы.

У меня все есть с EasyMock и TestNG.

Но я не могу найти способ внедрить SecurityContextHolderStrategy (я использую этот интерфейс для того, чтобы иметь возможность внедрить и смоделировать SecurityContextHolder в моем контроллере, чтобы я мог иметь 2 разные установки, одну для производства и одну для тестирования, используя отдельный applicationContext. XML)

Но мне трудно создать bean-компонент, который может сопоставить SecurityContextHolderStrategy с правильными настройками (в Test пустой контекст и в prod inject реальный).

Кто-нибудь может мне помочь?

Вот пример кода контроллера.

@Controller
@RequestMapping("/topic/**")
public class TopicController {

@Autowired
PostRepository postRepo;
@Autowired
TopicRepository top;
@Autowired
PersonRepository per;
@Autowired
ProductRepository pro;
@Autowired
TopicControllerHelper topHelper;
@Autowired
SecurityContextHolderStrategy securityContext;

@RequestMapping(value="/topic/{topicId}", method=RequestMethod.GET)
public ModelAndView showPage(@PathVariable("topicId") int id){
    ModelAndView model = new ModelAndView("/topic");
    Topic topic = top.findTopicByID((long) id);
    model.addObject("topic",topic); 
    Post post = new Post();
    post.setPerson(topic.getPerson());
    post.setTopic(topic);
    model.addObject("post",post);
    model.addObject("logged",securityContext.getContext().getAuthentication().getName());
    return model;
}

И мой тестApplicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:sec="http://www.springframework.org/schema/security" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <context:spring-configured />
    <context:component-scan base-package="br.com.gsc" />
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<!--    <tx:annotation-driven transaction-manager="transactionManager"/>     -->
    <mvc:annotation-driven />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="gscTest" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="securityContext" class="org.springframework.security.core.context.SecurityContextHolderStrategy">

Я заблудился здесь !!! Что должно быть здесь в тестировании и производстве заставить контекст работать в каждом .xml?

    </bean>

    <!-- <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" 
        p:definitions="/WEB-INF/tiles-defs.xml" /> -->

</beans>

Ответы [ 2 ]

0 голосов
/ 06 ноября 2013

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

0 голосов
/ 06 марта 2012

Я понимаю, что это не прямой ответ на ваш вопрос, но задумывались ли вы об использовании Powermock для насмешки над статическим методом SecurityContextHolder.getSecurityContext ()?

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