如何在java中使用Mockito来模拟Keycloak框架方法

4si2a6ki  于 2022-11-08  发布在  Java
关注(0)|答案(1)|浏览(201)

我有功能从KeyCloak获取以下详细信息。
1.用户详细信息
1.领域详细信息
1.客户端详细信息
我想使用Mockito为这些功能编写测试用例。
下面是用于获取这些详细信息代码逻辑

@Autowired
private Keycloak keycloak;
@Value("${keycloak.realm}")
private String realm;

public Optional<UserModel> getUsers(String userId) {
  UserResource userResource = keycloak.realm(realm).users().get(userId);
  if (userResource == null)
    return Optional.empty();
  UserRepresentation userRepresentation = userResource.toRepresentation();
  UserModel userModel = new UserModel(userRepresentation.getId(), userRepresentation.getFirstName(),
      userRepresentation.getLastName(),
      userRepresentation.getUsername(),
      userRepresentation.getEmail(), userRepresentation.isEnabled(),
      new Date(userRepresentation.getCreatedTimestamp()),
      new Date(userRepresentation.getCreatedTimestamp()),
      userRepresentation.getGroups(),
      userRepresentation.getRealmRoles());
  return Optional.of(userModel);
}

public Optional<RealmModel> getRealm(String realmId) {
  RealmResource realmResource = keycloak.realms().realm(realmId);
  if(realmResource == null)
    return Optional.empty();
  RealmRepresentation realmRepresentation = realmResource.toRepresentation();
  RealmModel realmModel = new RealmModel(realmRepresentation.getId(), realmRepresentation.getDisplayName());
  return Optional.of(realmModel);
}

public Optional<ClientModel> getClient(String clientId) {
  ClientResource clientResource = keycloak.realm(realm).clients().get(clientId);
  if(clientResource == null)
    return Optional.empty();
  ClientRepresentation clientRepresentation = clientResource.toRepresentation();
  ClientModel clientModel = new ClientModel(clientRepresentation.getClientId(), clientRepresentation.getName()) ;
  return Optional.of(clientModel);
}

我想在测试用例中模拟KeyCloak方法,
例如,

1. UserResource userResource = keycloak.realm(realm).users().get(userId);
2. UserRepresentation userRepresentation = userResource.toRepresentation();

我想嘲笑一些像下面这样的东西

Mockito.when(keycloak.realm(Mockito.anyString()).users().get(Mockito.anyString())).thenReturn(userResource);

我不知道是否有任何选项可用,请帮助我解决这个问题.谢谢

cidc1ykv

cidc1ykv1#

首先,您需要有一个构造函数来接收自动连接的对象和值,而不是在字段上添加这些注解(这也是一个best practice):

// constructor
public YourBean(@Autowired Keycloak keycloak, @Value("${keycloak.realm}") String realm) {
    this.keycloak = keycloak;
    this.realm = realm;
}

然后,您需要在测试函数中的bean上传递一个模拟的Keycloak对象:

Keycloak keycloak = Mockito.mock(Keycloak.class);
String realm = "mockedRealm";
YourBean bean = new YourBean(keycloak, realm);

所以你可以执行Mockito.when函数,但是要注意你需要模拟keycloak.realms().realm(realmId)中的每个函数调用,使用Mockito.when链接函数是行不通的。

相关问题