Автопроводка с заводским методом в объеме запроса - PullRequest
4 голосов
/ 29 октября 2011

Я пытаюсь протестировать приложение Spring.Используя Spring-Security, у меня возникают проблемы с имитацией SecurityContext для модульного тестирования моих контроллеров.

Я нашел следующий вопрос: Юнит-тестирование с Spring Security

И я пытаюсь, чтобы ответ "сообщество-вики" (2-й ответ в настоящее время) работал над моим веб-приложением.

В основном я использую разработку на основе аннотаций, тогда у меня есть следующее:

MainController.java

@Controller
public class MainController {

    private User currentUser;

    @Autowired
    @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }

    ...

}

UserFactory.java

@Component
public class UserFactory {

    @Bean
    public User getUserDetails() {
        Authentication a = SecurityContextHolder.getContext().getAuthentication();
        if (a == null) {
            return null;
        } else {
            return (User) a.getPrincipal();
        }
    }
}

User.java

public class User implements UserDetails {

    private long userId;
    private String username;
    private String password;
    private boolean enabled;
    private ArrayList<GrantedAuthority> authorities;

    public User() {

    }

    ...

}

Проблема заключается в том, что метод getUserDetails () кажетсяникогда не вызываться и UserFactory никогда не используется.(Я пробовал System.out.println и пробовал отладчик)

Но нет ошибки в том, что MainController не был подключен во время выполнения или при любом запросе.

Атрибут currentUser, кажется,alaways null.

Я также просматривал этот вопрос, не найдя чего-то, что отвечает моим потребностям: проблема в компоненте бобов сеанса Spring с AOP

Это мой первый веб-ресурс Springприложение, пожалуйста, не будь резким.:)

1 Ответ

4 голосов
/ 30 октября 2011

Первое, что я заметил, это то, что вы поставили @Scope в неправильном месте.Он должен идти по методу @Bean, а не по методу @Autowired, то есть

@Autowired
public void setCurrentUser(User currentUser) {

@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public User getUserDetails() {

Я удивлен, что Spring не жаловался на это.

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