此单元测试是否必须与其测试的控制器位于同一个包中?

时间:2010-10-23 17:59:52

标签: java unit-testing htmlunit

根据this example,它与它测试的控制器位于同一个包中。

为什么这是必需的?

我认为将所有单元测试都放在testing包中会更整洁 - 这样做会有问题吗?

package com.example.web.controllers;

...imports...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/testApplicationContext.xml"})
public class HomeControllerSysTest extends AbstractJUnit4SpringContextTests {

    private static final Logger log = Logger.getLogger(
            HomeControllerSysTest.class.getName());
    private final LocalServiceTestHelper helper =
            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

    @Before
    public void setUp() {
        helper.setUp();
    }

    @After
    public void tearDown() {
        helper.tearDown();
    }

    @Test
    public void testHomeController() throws IOException {
        final String url = "http://localhost:8080/movie/test";

        final WebClient webClient = new WebClient();
        final HtmlPage page = webClient.getPage(url);
        assertEquals("The Page Title", page.getTitleText());

        // there are many different methods to query everything on your
        // page. Please refer to the HttpUnit homepage
        HtmlElement header = page.getElementsByTagName("h1").get(0);
        assertNotNull(header);

        String headerValue = header.getNodeValue();
        assertEquals(headerValue, "Hello World!");
    }
}

3 个答案:

答案 0 :(得分:6)

将它们保存在同一个包中允许测试包私有对象和方法。 为了保持整洁,请通过创建并行源树将测试放在“相同”包中。

src/
  com/
    example/
      MyClass.java

tests/
  com/
    example/
      MyClassTest.java

两个源树都可以编译到同一个输出目录中,或者以其他方式添加到类路径中,从而导致它们与JVM有关,因此它们位于同一个包中。

答案 1 :(得分:3)

是否必须?否。

应该吗?这就是惯例。

当用于生产的jarring时,无论您如何组织项目,具有适当属性的Ant任务都可以删除所有测试类。因此,物理位置在这方面并不重要。

对于正常的“源”震动,将测试用例放在相关源代码附近会更好,这样您就可以更轻松地创建源代码。

Java具有包级访问权限(类似于私有和公共访问),但我认为这种访问不常用。

最重要的是你进行单元测试。其余的不是IMO那么重要。

答案 2 :(得分:1)

单元测试可以在任何包中。实质上,它们只是用于测试被测试类行为的单独类。

这里最重要的问题是JUnit测试类的放置是他们所属项目的常量。即要么它们总是在同一个包中,要么在具有名称测试的子包中,或者在一个单独的包中。

我的偏好是将JUnit测试类放在一个单独的包中,通过用'test'替换顶级名称来定义,因此org.util.strings.StingUtil将有一个名为test.util.StringUtilTest的Junit测试类。

通过这种方式,可以很容易地找到测试类,并且可以轻松地将它们分成库.jars和它们的测试.jars。此外,您不会冒JUnit测试无意中使用对测试类的包级访问的风险;测试类必须使用与世界其他地方相同的界面。 (在我看来,专门用于测试支持的包级钩子是邪恶的,所以最好通过将测试放在别处来确保它们没用。)