2017-08-03 3 views

答えて

0

私の同僚は私のためにこの仕事をしてしまった。彼の戦略はシンプルでしたが、同時に迷惑になりました。

public abstract class KeycloakTestBase { 
    protected final KeycloakSession session = mock(KeycloakSession.class); 
    protected final HttpRequest request = mock(HttpRequest.class); 
    protected final RealmModel realm = mock(RealmModel.class); 
    protected final UserProvider userProvider = mock(UserProvider.class); 
    protected final UserCredentialManager userCredentialManager = mock(UserCredentialManager.class); 
    protected final EventBuilder eventBuilder = mock(EventBuilder.class); 
    protected final ThemeProvider themeProvider = mock(ThemeProvider.class); 
    protected final Theme theme = mock(Theme.class); 
    protected final KeycloakContext context = mock(KeycloakContext.class); 

    protected KeycloakTestBase() { 
     when(session.userLocalStorage()).thenReturn(userProvider); 
     when(session.userCredentialManager()).thenReturn(userCredentialManager); 
     when(session.getContext()).thenReturn(context); 

     when(context.getRealm()).thenReturn(realm); 

     when(realm.getLoginTheme()).thenReturn("ourtheme"); 

     when(eventBuilder.user(anyString())).thenReturn(eventBuilder); 

     when(userProvider.getUserById(anyString(), eq(realm))).thenReturn(getRandomUser()); 

     when(session.getProvider(ThemeProvider.class, "extending")).thenReturn(themeProvider); 

     try { 
      when(themeProvider.getTheme(anyString(), any(Theme.Type.class))).thenReturn(theme); 
      when(theme.getMessages(any(Locale.class))).thenReturn(new Properties()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    protected UserModel getRandomUser() { 
     return spy(new InMemoryUserAdapter(session, realm, UUID.randomUUID().toString())); 
    } 
} 

その後、これを新しい単体テストの作成のベースとして使用しました。この基底クラスは、ほとんどのものを結びつけ、元来のデフォルトを戻します。

基本的なキークローズクラスを拡張するクラステストの難しさは、キークローズコードで呼び出されるいくつかの静的メソッドを実行することがあります。運がよければ、静的コードを削除し、それを依存関係として渡すことができます。もしあなたが不運なら......あなたは不運です。まだ不運なケースに遭遇していない。たとえば、AuthenticationManagerという静的クラスへの呼び出しを軽減するには、AuthenticationManagerHelperがあります。

public class AuthenticationManagerHelper { 

    public AuthenticationManager.AuthResult authenticateIdentityCookie(KeycloakSession session, RealmModel realm, boolean checkActive) { 
     return org.keycloak.services.managers.AuthenticationManager.authenticateIdentityCookie(session, realm, checkActive); 
    } 
} 
関連する問題