【问题标题】:Creating object of Private Inner class from other class从其他类创建私有内部类的对象
【发布时间】:2014-12-02 22:28:18
【问题描述】:

我有一个场景,其中有一个公共外部类和一​​个私有内部类。现在我想创建这个私有内部类的一个对象,用于对其中的方法进行单元测试。

public class MyOuterClass {
    public MyOuterClass() { }

    private class MyInnerClass {
        public MyInnerClass() { }
    }
}

这是我试图从其他测试类创建“MyInnerClass”对象的场景。我找到了使用私有构造函数创建类对象的解决方案,但这不是我所需要的。请帮我解决一下这个。 提前致谢。

【问题讨论】:

  • 您不需要对私有内部类进行单元测试。这应该告诉你你的类设计是错误的(或者你的测试方法是错误的)。
  • 类不能有()

标签: java android reflection junit private-members


【解决方案1】:

private 对象的整个概念是它只能由封装它的类访问。您不能直接从另一个类创建私有对象的实例。

【讨论】:

  • 如果是这样,您如何在单元测试中实现 100% 的代码覆盖率,对于此类代码,有诸如反射之类的方法来访问私有成员,但我不确定如何在这种情况下做到这一点.
【解决方案2】:

您有三个选择:

  1. 将内部类包设为私有(改为默认访问级别),您可以通过将测试代码放在同一个包中来访问它。

  2. 使用反射通过覆盖访问限制来访问它。

  3. 重新思考您的架构。您可能需要直接测试私有内部类,但更常见的是测试外部类并通过这样做也测试内部类。

【讨论】:

  • +1 点 #1 和 #3(尤其是 #3)。选项 #2 很严峻。
  • @Tim 使用#3 对于我的场景,内部类是一个扩展 Handler 的类,它覆盖了句柄消息方法,除非你创建内部类的对象,否则不能直接调用它。
  • @tim 我们不能在所有情况下都更改访问修饰符。所以我认为使用反射会是一种更好的方法。您能否将示例代码 sn-p 发布为我是反射新手。
  • 周围有很多教程,例如google发现了这个:tutorials.jenkov.com/java-reflection/…
  • 在任何教程中,我都没有发现创建私有内部类的对象。你建议的这个链接也只有关于字段和方法以及私有构造函数。但不是我需要的..对不起..:\
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2019-08-03
  • 2015-08-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多