2013-01-15 52 views
1

環境:
的Eclipse朱諾
Junit的4.11
行家3.0.4
JUnit的不尊重行家類路徑

問題:

相信運行在Eclipse的一個單元測試時,我有一個類加載問題junit亞軍。 我的具體問題,從這個代碼莖:

this.getClass().forName(type); 

上面的代碼將獲得與生活在一個行家依賴一類的名稱叫做最終(的依賴是簡單的Java bean的集合)。 當我運行mvn測試時,此代碼運行成功,但是如果我使用eclipse運行junit測試,則會收到類未找到的異常。

在運行配置的類路徑選項卡中找到的類路徑條目引用了Maven依賴關係。所以我不知道爲什麼依賴沒有被拉入。

爲什麼會發生這種情況?我在eclipse中安裝了maven插件,所以它應該使用相同的類路徑。然而,似乎並非一切都是相同的。我試着做清理,更新maven項目配置並重新啓動eclipse。

.classpath文件

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" output="target/classes" path="src/main/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="output" path="target/classes"/> 
</classpath> 

項目文件

<?xml version="1.0" encoding="UTF-8"?> 
<projectDescription> 
    <name>brokenClasspathproject</name> 
    <comment></comment> 
    <projects> 
    </projects> 
    <buildSpec> 
     <buildCommand> 
      <name>org.eclipse.wst.common.project.facet.core.builder</name> 
      <arguments> 
      </arguments> 
     </buildCommand> 
     <buildCommand> 
      <name>org.eclipse.jdt.core.javabuilder</name> 
      <arguments> 
      </arguments> 
     </buildCommand> 
     <buildCommand> 
      <name>org.eclipse.m2e.core.maven2Builder</name> 
      <arguments> 
      </arguments> 
     </buildCommand> 
    </buildSpec> 
    <natures> 
     <nature>org.eclipse.jdt.core.javanature</nature> 
     <nature>org.eclipse.m2e.core.maven2Nature</nature> 
     <nature>org.eclipse.wst.common.project.facet.core.nature</nature> 
    </natures> 
</projectDescription> 


junit的配置

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig"> 
<stringAttribute key="bad_container_name" value="/brokenClasspathproject/junit"/> 
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> 
<listEntry value="/brokenClasspathproject"/> 
</listAttribute> 
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> 
<listEntry value="4"/> 
</listAttribute> 
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=brokenClasspathproject"/> 
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> 
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> 
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> 
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/> 
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> 
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="brokenClasspathproject"/> 
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/> 
</launchConfiguration> 
+0

Maven將測試類路徑包含在Eclipse項目類路徑中。否則你會有各種各樣的地獄。確保在運行目標中,手動設置類路徑。 –

+0

你能分享你的pom.xml內容嗎?也許你有依賴測試 –

+0

@EugenioCuevas我不能,但它所引用的依賴沒有定義範圍。 – ctwomey1

回答

1

我想我想通了,爲什麼會這樣!

我被執行的代碼很乾脆:

this.getClass().forName(name); 

這是在Maven的工作,但不JUnit的獨立。但是,當我改變我的財產是:

this.getClass().forName(com.packagename.name); 

該代碼開始工作。我假設maven與surefire正在做一些後端巫術來識別名稱和com.packagename.name。如果我真的停下來閱讀javadoc,我就會看到class.forName需要包名。

所以我想道德是實際閱讀javadocs。對所有對此發表評論的人表示歉意(並衷心感謝!)!