2011-10-29 6 views
3

私はSpringアプリケーションを単体テストしようとしています。 Spring Securityを使用して、コントローラのユニットテストを行うためにSecurityContextを偽装するのに困っています。 リクエストスコープでファクトリメソッドでオートワイヤリングする

は、私は、次の質問が見つかりました: Unit testing with Spring Security

を、私は私のWebアプリでの作業(この時点では第二の回答)、「コミュニティのwiki」答えを持ってしようとしています。

私は主に、私は次の注釈しているドリブン者協会を使用

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はnullであるようです。 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() { 

に行く必要があります。

+0

あなたは正しいです、それは今働いています。どうもありがとうございます ! :) –

関連する問題