根据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!");
}
}
答案 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测试无意中使用对测试类的包级访问的风险;测试类必须使用与世界其他地方相同的界面。 (在我看来,专门用于测试支持的包级钩子是邪恶的,所以最好通过将测试放在别处来确保它们没用。)