【问题标题】:Not accessible function of what seem to be a public function似乎是公共功能的不可访问功能
【发布时间】:2018-11-24 14:46:12
【问题描述】:

我们正在集成到 Auth0 API 中,作为整个混乱的一部分,我们有一个函数可以将 UserInfo(来自 Auth0 库)转换为我们自己的案例类。

这个函数的签名是:

private[services] def convertUserInfoToAuth0UserInfo(userInfo: UserInfo): Auth0UserInfo

我正在尝试为此函数创建一个单元测试,而对于设置,我需要创建 UserInfo 对象并用数据填充它。

val profileMap = Map(
          "email" -> "name@email.com",
          "username" -> "username",
          "organizationName" -> "organizationName",
          "avatarUrl" -> "avatarUrl",
          "domains" -> List("domain.com"),
          "access_token" -> "access_token"
      )

      val userInfo = new UserInfo()
      userInfo.setValue("key", profileMap.asJava)

      val auth0UserInfo = service.convertUserInfoToAuth0UserInfo(userInfo)

      auth0UserInfo.accessToken must beSome("access_token")

问题是 setValue 函数由于某种原因无法访问,即使 UserInfo 类本身看起来像这样:

package com.auth0.json.auth;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.HashMap;
import java.util.Map;

/**
 * Class that holds the Information related to a User's Access Token. Obtained after a call to {@link com.auth0.client.auth.AuthAPI#userInfo(String)},
 * {@link com.auth0.client.auth.AuthAPI#signUp(String, String, String)} or {@link com.auth0.client.auth.AuthAPI#signUp(String, String, String, String)}.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserInfo {

    private Map<String, Object> values;

    UserInfo() {
        values = new HashMap<>();
    }

    @JsonAnySetter
    void setValue(String key, Object value) {
        values.put(key, value);
    }

    /**
     * Getter for the values contained in this object
     *
     * @return the values contained in the object.
     */
    @JsonAnyGetter
    public Map<String, Object> getValues() {
        return values;
    }
}

除非我遗漏了什么,否则setValues 是公开的。 为什么我不能使用它?

【问题讨论】:

  • 我看到了一个私有包void setValue(...),这意味着setValues(...) 无法工作,因为方法名称不匹配,并且因为您与void setValue(...) 不在同一个包中。有关 Java 访问修饰符的信息,请参阅 this 答案。
  • 改为使用:userInfo.getValues().put("https://app.process.st/", profileMap.asJava)
  • 哈哈!!!显然,出于同样的原因,我什至无法构造对象
  • 是的,也是。连那个都没看。
  • 那不是很有用,那我们怎么测试这个东西呢?

标签: java scala auth0


【解决方案1】:

即使类是public,默认情况下该方法没有访问修饰符关键字:

void setValue(...) \\Package-Private

由于您不拥有该软件包,因此您无法通过这种方式进行单元测试。此外,这在技术上进入了集成测试领域。

正确的方法是设置一个模拟环境,使用注入或环境变量来控制使用哪个类。

【讨论】:

  • 它不受保护,它是包私有的。如果它受到保护,那会更容易一些,因为 UserInfo 可以简单地被子类化以使方法公开。但是,在这种情况下,测试必须使 setValue 可访问并通过反射调用它。
  • @LucasRoss,你是对的,它是一个 Java 包,因此没有访问修饰符意味着包私有。我已经更新了我的答案。谢谢!
猜你喜欢
  • 2019-12-19
  • 2023-01-20
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多