jUnit有两种方法失败

时间:2011-05-25 11:07:10

标签: java unit-testing junit

我有一个测试类,有两个注释为@Test的方法。

如果我通过评论另一个单独运行每个方法,它就会成功。但如果两者一起运行,它就会失败。可能是什么原因?

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

}

}

5 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

是否可能每个状态都会更改系统的状态(数据库或某些静态字段等),但不能在@After方法中正确清除它?

答案 2 :(得分:0)

在使用@Before注释的方法中,可能会在这两种方法之间共享一些未重新初始化的数据。

答案 3 :(得分:0)

我猜测测试方法没有独立设置环境。因此,给定java调用中的第一个测试有效,但会使环境处于不适合下一次测试运行的不同状态。

如果您在静态初始化程序段中设置了重要状态,或者可能在测试的构造函数中设置了重要状态,则可能会违反此规定。重要状态应该在测试方法中初始化为局部变量,或者通过用@Before注释的方法初始化。

你应该扩展“它失败”意味着什么 - 它是两个测试中的第二个,任何机会失败,而第一个运行成功?

答案 4 :(得分:0)

JUnit Tests与“普通”开发人员的想法非常不同。强烈建议您阅读JUnit文档。

如果您使用两个@Test方法进行JUnit测试,则会发生以下情况: o创建了TestClass的对象 o第一种测试方法叫做

创建另一个对象(因此第一个方法已更改的每个实例字段现在都丢失了) o第二种测试方法叫做

这不是一个“bug”,而是一个设计特征......换句话说,发明者想要这样。如果你不熟悉像JUnit这样的工具,那么考虑一下TestNG,从长远来看它对你来说可能更有用。