Java 在同一项目中进行Eclipse junit测试

Java 在同一项目中进行Eclipse junit测试,java,eclipse,junit,Java,Eclipse,Junit,这是一个相对开放的问题。如果我在Eclipse中的一个项目中构建了一个应用程序,然后我想测试这个项目,那么我应该在同一个项目中创建JUnit代码还是创建一个单独的项目。例如 ShopSystem可能是我主要项目的名称-我应该创建一个名为ShopSystemTest的项目吗 一般来说,测试代码应该存储在距离主项目文件夹多远的地方?如果我将测试代码存储在主项目中,然后将主项目导出为可运行的jar,它将携带测试代码,这并不理想 建议?虽然没有唯一正确的方法,但通常的方法是将单元测试保持在同一个项目中

这是一个相对开放的问题。如果我在Eclipse中的一个项目中构建了一个应用程序,然后我想测试这个项目,那么我应该在同一个项目中创建JUnit代码还是创建一个单独的项目。例如

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");
    }

}