非公共静态嵌套类?

时间:2014-08-06 19:34:27

标签: java encapsulation nested-class

我正在尝试为一段代码编写测试,该代码使用以下对象的内部类作为输入(我已将这些名称一般化)。

public class MockOuterClass implements OuterClass, Mock {

  static class MockInnerClass implements InnerClass {
  //fields and methods of the nested class
  }

//methods of the outer class
}

现在由于内部类没有可见性标记,因此默认为" protected。"这就是我的问题:由于我的测试和源代码在不同的包中,我如何创建这个内部对象的实例?我试过这个:

MockOuterClass.MockInnerClass test = new MockOuterClass.MockInnerClass();

当我这样做时,Eclipse说这行是不可接受的(我认为是这种情况,但这是一厢情愿的想法),因为MockInnerClass默认为protected,因此不能在其包之外使用。我有办法以某种方式使用这个类吗?我没有写源代码,所以我不确定是否缺少公共"内部课堂上的标签是故意的或程序员的错误。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

有点抛开,不是真正的答案,但我总是把我的测试放在与被测试的类相同的包中。至少,尽可能地,有一些非常罕见的情况,这是不可能的。

为什么使用其他套餐?有这么好的理由吗?

现在,回到答案,如果你坚持从单独的软件包进行测试,除非MockOuterClass公开某些方法构建(或公开)MockInnerClass,你卡住了。 (我猜你可以尝试使用Reflection但是这已经变得绝望了。)但是,正如几个人所评论的那样,该类的作者“打算”为内部类隐藏,a。 LA。肯特贝克。

换句话说,如果您关注Kent Beck,您应该编写针对MockOuterClass而不是MockInnerClass的测试。内部阶级是“非公开细节”。

答案 1 :(得分:0)

如果此代码未由您编写并声明非公开静态类(旁注:默认为受软件包保护,这与保护非常不同),作者打算隐藏你的课程。简而言之,没有办法从包外面访问课程,你可能不应该尝试。