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

public class MockOuterClass implements OuterClass, Mock {

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

//methods of the outer class
}


现在,由于内部类没有可见性标签,因此默认为“保护”。这是我的问题所在:由于测试和源代码位于单独的程序包中,因此如何创建此内部对象的实例?我试图这样做:

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


当我这样做时,Eclipse表示这行是不可接受的(我认为是这种情况,但这是一厢情愿的),因为MockInnerClass默认为protected,因此不能在其程序包之外使用。有什么办法可以使用该类吗?我没有编写源代码,因此不确定内部类上是否缺少“ public”标签是故意的还是程序员的错误。

先感谢您。

最佳答案

暂且不谈,不是一个实际的答案,但我始终将测试与要测试的类放在同一程序包中。至少,在极少数情况下,这是不可能的。

为什么要使用其他包装?是否有充分的理由这样做?

现在,回到答案,如果您坚持要求使用单独的程序包进行测试,除非MockOuterClass公开了构造(或公开)MockInnerClass的某种方法,否则您将陷入困境。 (我猜您可以尝试使用Reflection,但是那已经很绝望了。)但是,正如一些人所评论的,该类的作者“打算”隐藏内部类a。拉肯特·贝克。

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

10-06 13:07