Java 在同一项目中进行Eclipse junit测试
这是一个相对开放的问题。如果我在Eclipse中的一个项目中构建了一个应用程序,然后我想测试这个项目,那么我应该在同一个项目中创建JUnit代码还是创建一个单独的项目。例如Java 在同一项目中进行Eclipse junit测试,java,eclipse,junit,Java,Eclipse,Junit,这是一个相对开放的问题。如果我在Eclipse中的一个项目中构建了一个应用程序,然后我想测试这个项目,那么我应该在同一个项目中创建JUnit代码还是创建一个单独的项目。例如 ShopSystem可能是我主要项目的名称-我应该创建一个名为ShopSystemTest的项目吗 一般来说,测试代码应该存储在距离主项目文件夹多远的地方?如果我将测试代码存储在主项目中,然后将主项目导出为可运行的jar,它将携带测试代码,这并不理想 建议?虽然没有唯一正确的方法,但通常的方法是将单元测试保持在同一个项目中
ShopSystem
可能是我主要项目的名称-我应该创建一个名为ShopSystemTest
的项目吗
一般来说,测试代码应该存储在距离主项目文件夹多远的地方?如果我将测试代码存储在主项目中,然后将主项目导出为可运行的jar,它将携带测试代码,这并不理想
建议?虽然没有唯一正确的方法,但通常的方法是将单元测试保持在同一个项目中 您可以创建第二个源文件夹(如
test
),在该文件夹中,您可以将测试类放入与被测试类相同的包中。这还允许您测试包私有类,同时不让测试类充斥主源包
您的源文件夹/包结构将如下所示:
-sources
-main
-my.package
-MyClass.java
-test
-my.package
-MyClassTest.java
然后,您可以将构建配置为在打包JAR时不包含测试源文件夹。通常您有-
/src/main/java (for codes)
/src/test/java (for tests)
考虑maven方式:在maven项目中,Soruce是这样组织的
src
|--main
| |--java
|--test
|--java
源代码放在src/main/java中,junit测试代码放在src/test/java中,它们都是源文件夹(因此,您可以将junit代码放在与java代码相同的包中,但放在不同的源文件夹中)
有趣的是,对于通常的编码,您的jUnit类在代码包中,但是在创建jar时,您可以只获取来自src/main/java的类,而不发布您的测试。我非常喜欢maven约定:在同一个项目中,main和test有一个单独的源代码树,部署了主代码,测试代码没有。包结构可以(但不一定)相同
project
src
main
java // source files
resources // xml, properties etc
test
java // source files
resources // xml, properties etc
在eclipse中,当您选择new->JUnit test case
时,您只需将源文件夹更改为src/test/java,并保持建议的包不变
(留在同一个包中的好处之一是可以访问受保护的和包范围的成员,尽管这不是“正确的”单元测试行为)
更新:这里有一些代码来说明我的最后一点:
Main类(在src/Main/java中):
测试类(在src/Test/java中):
“访问受保护的和包作用域的成员”-要访问受保护的成员,您必须对被测试的类进行子类化。你的意思是能够访问包范围的类,对吗?哦,当然还有成员,你是对的。我很少使用默认范围的成员,有时甚至忘记了它们的存在。哎哟!我不知道protected
允许从同一个包中的其他类访问。好的,这就澄清了问题,谢谢。是的,整个访问级别的概念相当愚蠢。e、 g.在不公开类的情况下,无法让子包访问包。“scala有一个更好的系统。”西尼泽:我同意。如果Java是在今天设计的,那么private可能是默认值,protected将只允许从子类访问,将有子包的概念,final
将是类、局部变量甚至成员的默认值。哦,好吧。
package com.test;
public class Foo{
static class Phleem{
public Phleem(final String stupidParameter){
}
}
String bar;
protected String baz;
protected Object thingy;
}
package com.test;
import org.junit.Test;
public class FooTest{
@Test
public void testFoo(){
final Foo foo = new Foo();
foo.bar = "I can access default-scoped members";
foo.baz = "And protected members, too";
foo.thingy = new Foo.Phleem("And I can access default-scoped classes");
}
}