为java友好/内部包类和内部/友好方法生成公共访问器类

时间:2012-04-21 00:41:45

标签: java android unit-testing junit

我有一个包含单个公共外观的包,有两个方法,start和stop。 因为这个外观适用于类似于50+内部/友好类包的东西,所以我需要一种能够直接测试其中几个内部类的方法。

我正在使用Eclipse和JUnit。

反射可能是一种好方法,但为什么我自己编写所有这些反射代码,是否有一个很好的工具可以生成包装公共类(如.net visual studio can)?

其次,有人可以解释如何管理JUnit的双源树,或者请参考该主题的好文章? 我看过几篇博客文章,但更喜欢看看这里的人是否有一个很好的解释/参考。

而且,最重要的是 - 无论是否测试内部类,这不是我的问题,这是我的设计,这是我喜欢的工作方式。 有些人认为你应该,有些人认为你不应该,所以请不要发布答案,例如:你应该只测试公众,从而解决了问题。 我在stackoverflow中搜索并找不到关于它的好帖子。

提前谢谢你,

詹姆斯。

2 个答案:

答案 0 :(得分:1)

据我了解Louis Wasserman的回复,你的文件结构看起来像是

src/production/mypackage/MyClass.java

src/junit/mypackage/MyClassTest.java

然后src / production / mypackage / MyClass.java看起来像

class MyClass
{
      void start ( ) { ... }
      void stop ( ) { .... }

      class InnerClass1 { ... } 
      class InnerClass2 { ... }\
      ...
      class InnerClass50 { ... }
}

由于MyClassTest和MyClass在同一个包中,mypackage.MyClass.InnerClass1 ... 50可以从MyClass测试中进行测试。

确保MyClass不依赖于MyClassTest。对于生产,您可以编译生产目录中的所有内容(跳过junit tests wholeley)。用于测试编译两个目录。

答案 1 :(得分:1)

您维护双源树的直觉是正确的。只需要两个源目录,其中包含相同的目录/包结构。编译为类似的单独输出目标,但在运行测试时将所有内容放在类路径中。尽管类可能甚至是不同的输出目录,但它们相同的目录/包结构将使其工作。如果你使用Maven,这是标准的。使用该工具,源目录名称为src/mainsrc/test,输出目录为target/classestarget/test-classes。事实上Maven支持这个开箱即用的事实表明了这种做法在Java社区中的标准,你应该放心使用它。 (就此而言,我鼓励你使用Maven,它会让你的生活变得更轻松。你可以使用Maven和Eclipse,很多人都可以。)

现在单元测试位于包中,您可以测试所需的所有受包保护的类。我不同意那些只说测试public事情的人。事实上,作为TestNG的作者,塞德里克·贝斯特(Cedric Beust)的杰出人物,if it can break, it should be tested, and that includes private methods认为。我有单元测试的私有方法with a little help from reflection。包保护的东西当然更容易测试。无论如何,我认为仅仅public事应该被测试是一种宗教观点。