0
Keycloakに付属のUsernamePasswordForm
認証ツールを拡張しました。私はそれを "ユニット化"する方法の例を探していました。新しいKeycloakオーセンティケータをユニットテストする方法は?
例はありますか? または、どこかで私を指差しますか?
Keycloakに付属のUsernamePasswordForm
認証ツールを拡張しました。私はそれを "ユニット化"する方法の例を探していました。新しいKeycloakオーセンティケータをユニットテストする方法は?
例はありますか? または、どこかで私を指差しますか?
私の同僚は私のためにこの仕事をしてしまった。彼の戦略はシンプルでしたが、同時に迷惑になりました。
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);
}
}