2011-10-29 79 views
3

我試圖對我的Spring應用程序進行單元測試。 使用Spring-Security,我有麻煩嘲笑SecurityContext爲了單元測試我的控制器。在請求範圍內使用工廠方法自動裝配

我發現以下問題:Unit testing with Spring Security

而且我想有「社區維基」的回答(第2個答案在這個時候)我的web應用程序的工作。

我主要使用註解驅動DEVELOPPEMENT的話,我有以下幾點:

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似乎是空的。

我也看了在這個問題上沒有找到的東西,符合我的需要:problem in Spring session scope bean with AOP

這是我的第一個春天web應用程序,請不要苛刻。 :)

回答

3

我注意到的第一件事是,您已將@Scope放在錯誤的地方。它應該去的@Bean方法,而不是@Autowired方法,即

@Autowired 
public void setCurrentUser(User currentUser) { 

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

我很驚訝的是,Spring沒有抱怨這一點。

+0

你是對的,它現在正在工作。非常感謝 ! :) –