2013-03-12 50 views
0

我一個很奇怪的問題,想了解它的工作。同JUnit測試的螞蟻,但不是在Maven的

嗯,問題是當我嘗試運行Maven Test時,我的一些JUnit測試崩潰了,但是在Ant或Eclipse的插件中它完美地工作。

調試其中一個單元測試我發現了這個問題:當我將它運行到Maven中時,一個顯式設置爲「false」的模擬類中的布爾屬性總是「真」。這隻發生在一個用@Test註釋的方法中。

我猜其中一個方法正在改變我的屬性的值,就像類以不同的順序執行或類似的東西......我不知道。

我解決了它將變量再次變爲「false」到我的方法中,確保了我想要的值。

有人知道爲什麼會發生這種情況?

謝謝!

Maven的版本: 3.0.4

@After 
public void limpa() { 
    Mockit.restoreAllOriginalDefinitions(); 
} 

@Test 
public void testWithError() throws Exception { 
    Mockit.redefineMethods(MyObject.class, MyObjectMock.class); 
    MyOtherObject myOtherObject = createMyOtherObject(); 
    MyObjectMock.hasRules = false; 
    try { 
     myService.executeServiceA(myOtherObject); 
     Assert.fail("Can't get here. Should throw as exception."); 
    } catch (Exception e) { 
     Assert.assertEquals("Exception ", "You can't do this beacause of ...", e.getMessage()); 
    } 
} 

我的模擬:

public class MyObjectMock{ 

    //Others attibutes 
    (...) 
    public static boolean hasRules = false; 

    //Setters and getters 
    (...) 
} 

我POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myproject</groupId> 
    <artifactId>myProject</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <properties> 
     <jmockit.version>0.0.1</jmockit.version> 
    </properties> 

    <build> 
     <testSourceDirectory>src/test/java/junit</testSourceDirectory> 
     <resources> 
      <resource> 
       <directory>src/main/java</directory> 
       <excludes> 
        <exclude>**/*.java</exclude> 
       </excludes> 
      </resource> 
     </resources> 

     <testResources> 
      <testResource> 
       <directory>src/test/java/selenium</directory> 
       <excludes> 
        <exclude>**/*.java</exclude> 
       </excludes> 
      </testResource> 
     </testResources> 

     <pluginManagement> 
      <plugins> 
       <!-- Need Java 5, which is the default since v2.3 of the maven-compiler-plugin. --> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>2.5.1</version> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.2</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <argLine> 
         -javaagent:"${settings.localRepository}"/mockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar 
        </argLine> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>asm</groupId> 
      <artifactId>asm</artifactId> 
      <version>1.5.3</version> 
     </dependency> 
     <dependency> 
      <groupId>bouncycastle</groupId> 
      <artifactId>bcprov-jdk14</artifactId> 
      <version>140</version> 
     </dependency> 
     <dependency> 
      <groupId>c3p0</groupId> 
      <artifactId>c3p0</artifactId> 
      <version>0.9.1</version> 
     </dependency> 
     <dependency> 
      <groupId>c3p0</groupId> 
      <artifactId>c3p0-oracle-thin-extras</artifactId> 
      <version>0.9.0.2</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-betwixt</groupId> 
      <artifactId>commons-betwixt</artifactId> 
      <version>0.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>1.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-email</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>net.sf.ehcache</groupId> 
      <artifactId>ehcache-core</artifactId> 
      <version>2.4.2</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.ehcache-spring-annotations</groupId> 
      <artifactId>ehcache-spring-annotations</artifactId> 
      <version>1.1.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-annotations</artifactId> 
      <version>3.4.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>3.4.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.3.2.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>net.sf.json-lib</groupId> 
      <artifactId>json-lib</artifactId> 
      <version>2.4</version> 
      <type>pom</type> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>2.5.6.SEC03</version> 
     </dependency> 
     <dependency> 
      <groupId>net.fckeditor</groupId> 
      <artifactId>java-core</artifactId> 
      <version>2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>backport-util-concurrent</groupId> 
      <artifactId>backport-util-concurrent</artifactId> 
      <version>3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc14</artifactId> 
      <version>10.2.0.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm.icu</groupId> 
      <artifactId>icu4j</artifactId> 
      <version>3.8</version> 
     </dependency> 
     <dependency> 
      <groupId>mockit</groupId> 
      <artifactId>jmockit</artifactId> 
      <version>${jmockit.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.lowagie</groupId> 
      <artifactId>itext</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>atg.taglib.json</groupId> 
      <artifactId>json-taglib</artifactId> 
      <version>0.4.1</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-httpclient</groupId> 
      <artifactId>commons-httpclient</artifactId> 
      <version>3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>net.sourceforge.jexcelapi</groupId> 
      <artifactId>jxl</artifactId> 
      <version>2.6</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>1.8.5</version> 
     </dependency> 

     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>1.8.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-server</artifactId> 
      <version>2.25.0</version> 
      <type>pom</type> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
      <version>2.5.6.SEC03</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-agent</artifactId> 
      <version>2.5.6.SEC03</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>2.5.6.SEC03</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-config-browser-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-convention-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-core</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-jasperreports-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-jfreechart-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-json-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.struts</groupId> 
      <artifactId>struts2-spring-plugin</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.velocity</groupId> 
      <artifactId>velocity</artifactId> 
      <version>1.6.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.velocity</groupId> 
      <artifactId>velocity-tools</artifactId> 
      <version>1.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.yahoo.platform.yui</groupId> 
      <artifactId>yuicompressor</artifactId> 
      <version>2.4.6</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>net.sf.jodreports</groupId> 
      <artifactId>jodreports</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.ws</groupId> 
      <artifactId>spring-oxm</artifactId> 
      <version>1.5.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.ws</groupId> 
      <artifactId>spring-ws-core</artifactId> 
      <version>1.5.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.ws</groupId> 
      <artifactId>spring-oxm-tiger</artifactId> 
      <version>1.5.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.ws</groupId> 
      <artifactId>spring-ws-core-tiger</artifactId> 
      <version>1.5.9</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.xml.bind</groupId> 
      <artifactId>jaxb-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.xml.bind</groupId> 
      <artifactId>jaxb-xjc</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.ws.commons.axiom 
      </groupId> 
      <artifactId>axiom-api</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.ws.commons.axiom 
      </groupId> 
      <artifactId>axiom-impl</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.seleniumhq.selenium.client-drivers</groupId> 
      <artifactId>selenium-java-client-driver</artifactId> 
      <version>1.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.11</version> 
     </dependency> 
     <dependency> 
      <groupId>org.acegisecurity</groupId> 
      <artifactId>acegi-security</artifactId> 
      <version>1.0.7</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.0</version> 
     </dependency> 



    </dependencies> 

</project> 
+2

顯示您的代碼和Ant/Maven腳本。 – carlspring 2013-03-12 16:21:46

+0

Ant和Maven使用不同的變量?很難說沒有看到你的代碼。 – ecbrodie 2013-03-12 16:22:59

+0

同時顯示您的目錄結構。測試課是否在正確的位置? – 2013-03-12 16:28:57

回答

3

不能在Ant和Maven算執行按相同的順序進行測試。如果測試有相互依賴關係,它也很容易陷入其中,單獨運行時測試通過的情況,但是當通過螞蟻/ Maven的運行,反之亦然失敗;或者只有在其他測試首先運行或類似時才通過。

要做的最好的事情是確保測試不相互依賴。如果測試因某種原因必須修改靜態數據,則應確保它在運行後重置靜態數據,以便每次測試都重新開始。例如:

public class NoRulesTest { 

    private static boolean oldRulesVal; 

    @BeforeClass 
    public static void NoRulesSetup() { 
     oldRulesVal = MyObjectMock.hasRules; 
     MyObjectMock.hasRules = false; 
    } 

    @AfterClass 
    public static void NoRulesTeardown() { 
     MyObjectMock.hasRules = oldRulesVal; 
    } 
} 
+0

真的很好的解釋!非常感謝! 但是,只是還有一個問題,大衛莫爾斯。我的方法@Before方法不應該用下面的命令來做到這一點? 「Mockit.restoreAllOriginalDefinitions();」 – Pmt 2013-03-13 03:39:36

+0

我對JMockit(我更喜歡[Mockito](http://code.google.com/p/mockito))並不十分熟悉,但是查看Javadoc中的'restoreAllOriginalDefinitions()',它看起來像贏了'不會影響'MyObjectMock' - 它所要做的就是讓'MyObject'再次使用自己的方法而不是模擬方法。如果你必須在兩次測試之間徘徊,也許不是一個好主意,但可能不會直接影響你的問題。 – 2013-03-13 14:59:25

+0

再次感謝! 其實我的@之前的方法根本沒有必要。 看一看: 「實際上,只有在某些測試中間需要恢復所有模擬類時,才應該使用此方法**,否則,這是不必要的,因爲** JMockit會自動恢復所有類在測試結束時進行測試**,以及在下一個測試類的第一次測試執行之前,所有類都被模擬爲整體測試類(例如,在@ BeforeClass JUnit方法中)。 – Pmt 2013-03-13 16:03:02

相關問題