2011-05-25 38 views
1

我有一個測試類,它有兩個註解爲@Test的方法。有兩種方法的jUnit失敗

如果我通過評論另一個單獨運行每個方法,它會成功。但是如果一起運行,它會失敗。可能是什麼原因?

public class ProductAvailTest { 
private static final String PRODUCT_AVAIL_BUILDER = "ProductAvailBuilder"; 


@Test 
public void productAvailResponseDateRequired() throws Exception { 

    ResponseBuilderFactory responseBuilderFactory = ResponseBuilderFactory.createResponseBuilderFactory(); 
    ResponseBuilder responseBuilder = responseBuilderFactory.createResponseBuilder(PRODUCT_AVAIL_BUILDER); 
    ProductAvailDateRqdHelper productAvailDateRqdHelper = new ProductAvailDateRqdHelper(); 
    List<Rsproducts> products = productAvailDateRqdHelper.getLOMProducts(); 

    // TODO change this to logger 
    System.out.println("No. of products in test " + products.size()); 

    GetProductAvailOutput actualProductAvailOutput = (GetProductAvailOutput) responseBuilder.buildSuccessResponse(
      products, productAvailDateRqdHelper.getProductAvailInput()); 
    GetProductAvailOutput expectedProductAvailOutput = productAvailDateRqdHelper.getProductAvailOutput(); 

    // TODO change this to logger 
    System.out.println("Size in expected " + expectedProductAvailOutput.getProductBrand().size()); 
    System.out.println("Size in actual " + actualProductAvailOutput.getProductBrand().size()); 

    Assert.assertEquals(expectedProductAvailOutput, actualProductAvailOutput); 

} 


@Test 
public void productAvailResponseInvBased() throws Exception { 
    ResponseBuilderFactory responseBuilderFactory = ResponseBuilderFactory.createResponseBuilderFactory(); 
    ResponseBuilder responseBuilder = responseBuilderFactory.createResponseBuilder(PRODUCT_AVAIL_BUILDER); 
    ProductAvailInvHelper productAvailInvHelper = new ProductAvailInvHelper(); 
    List<Rsproducts> products = productAvailInvHelper.getLOMProducts(); 

    // TODO change this to logger 
    System.out.println("No. of products in test " + products.size()); 

    System.out.println("No of inventory " + products.get(0).getRsproddtls().size()); 


    GetProductAvailOutput actualProductAvailOutput = (GetProductAvailOutput) responseBuilder.buildSuccessResponse(
      products, productAvailInvHelper.getProductAvailInput()); 
    GetProductAvailOutput expectedProductAvailOutput = productAvailInvHelper.getProductAvailOutput(); 

    // TODO change this to logger 
    System.out.println("Size in expected " + expectedProductAvailOutput.getProductBrand().size()); 
    System.out.println("Size in actual " + actualProductAvailOutput.getProductBrand().size()); 


    Assert.assertEquals(expectedProductAvailOutput, actualProductAvailOutput); 
} 




@Test 
public void productAvailResponseFreeSell() throws Exception { 

    ResponseBuilderFactory responseBuilderFactory = ResponseBuilderFactory.createResponseBuilderFactory(); 
    ResponseBuilder responseBuilder = responseBuilderFactory.createResponseBuilder(PRODUCT_AVAIL_BUILDER); 
    ProductAvailFreeSellHelper productAvailFreeSellHelper = new ProductAvailFreeSellHelper(); 
    List<Rsproducts> products = productAvailFreeSellHelper.getLOMProducts(); 

    // TODO change this to logger 
    System.out.println("No. of products in test " + products.size()); 

    GetProductAvailOutput actualProductAvailOutput = (GetProductAvailOutput) responseBuilder.buildSuccessResponse(
      products, productAvailFreeSellHelper.getProductAvailInput()); 
    GetProductAvailOutput expectedProductAvailOutput = productAvailFreeSellHelper.getProductAvailOutput(); 

    // TODO change this to logger 
    System.out.println("Size in expected " + expectedProductAvailOutput.getProductBrand().size()); 
    System.out.println("Size in actual " + actualProductAvailOutput.getProductBrand().size()); 

    Assert.assertEquals(expectedProductAvailOutput, actualProductAvailOutput); 

} 

}

+3

你會發布你的代碼嗎? – helios 2011-05-25 11:15:50

+0

helios,我已經添加了代碼。問題是如果我顛倒了序列,比如我在productAvailResponseInvBased()之前放置productAvailResponseFreeSell(),那麼測試失敗。而如果我把它作爲上面的順序它成功。可能是什麼問題呢? – Sripaul 2011-05-26 06:33:31

回答

0

我會冒險猜測測試方法沒有獨立設置它們的環境。因此,在給定java調用中的第一個測試可以工作,但會使環境處於不適合下次測試運行的不同狀態。

如果您在靜態初始化塊內或可能在測試的構造函數內設置重要狀態,則可能會犯此錯誤。重要狀態應該初始化爲測試方法中的局部變量,或者通過@Before註釋的方法。

你應該擴大「它失敗」的含義 - 它是第一個運行成功的兩次測試失敗的第二次嗎?

0

是否有可能每個狀態的改變系統狀態(DB或者一些靜態字段等),但並不清楚它在@After方法是否正確?

0

可能有一些數據在這兩種方法之間共享,這些數據在用@Before註釋的方法中沒有重新初始化。

0

JUnit測試的工作與「普通」開發人員的想法非常非常不同。強烈建議閱讀JUnit文檔。

如果你有兩個@Test方法JUnit測試時,發生了以下內容: O對你的TestClass的對象被創建 Ø第一次測試方法被稱爲

Ø另一個對象被創建(所以每第一種方法改變的實例字段現在丟失) o第二種測試方法被稱爲

這不是一個「錯誤」,而是一個設計特徵......換句話說,發明人希望它是這樣的。如果你不熟悉像JUnit這樣的工具,那麼考慮TestNG,從長遠來看,它可能對你更有用。

2

也許你做了這樣的事情:

import org.junit.Assert; 
import org.junit.Test; 


public class StatefulTest { 

    private static boolean shouldSucceed = true; 

    @Test 
    public void test1() { 
     System.out.println("shouldSucceed=" + shouldSucceed); 
     Assert.assertTrue(shouldSucceed); 
     shouldSucceed = false; 
    } 

    @Test 
    public void test2() { 
     System.out.println("shouldSucceed=" + shouldSucceed); 
     Assert.assertTrue(shouldSucceed); 
    } 
} 

第一個測試改變影響第二次測試的一些狀態。在這種情況下是一個靜態字段,但它也可能是文件內容或重用的Spring上下文中的一個bean。

+0

我想那正是我所做的。我沒有什麼靜力學,而且它帶來了一些問題。謝謝。 – Sripaul 2011-05-25 15:33:06

+0

不完全。因爲如果你看到我發佈的代碼,它沒有任何靜態 – Sripaul 2011-05-26 16:46:59

+0

GetProductAvailOutput是否有自己的equals和hashCode實現?您在此類的實例上聲明瞭equals,並且如果它們默認爲Object.equals,那麼即使它們具有相同的數據值,對於不同的實例也會失敗。我會先在實例上不使用assertEquals開始,但逐個比較相關的數據字段。 – 2011-05-27 10:40:00