jUnit с двумя методами не работает - PullRequest
1 голос
/ 25 мая 2011

У меня есть тестовый класс с двумя методами, помеченными как @ 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 ]

2 голосов
/ 25 мая 2011

Может быть, вы сделали что-то вроде этого:

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

Первый тест изменяет состояние, влияющее на второй тест.В этом случае статическое поле, но это может быть также содержимое файла или bean-компонент в повторно используемом контексте Spring.

0 голосов
/ 25 мая 2011

Тесты JUnit работают совсем не так, как думают «нормальные» разработчики.Настоятельно рекомендуется прочитать документацию по JUnit.

Если у вас есть тест JUnit с двумя методами @Test, происходит следующее: o создается объект вашего TestClass; o первый метод тестирования называется * 1003.*

o создается другой объект (поэтому каждое поле экземпляра, которое изменил первый метод, теперь теряется) o второй метод тестирования называется

Это не «ошибка», а конструктивная особенность ...другими словами, изобретатели хотели этого.Если вы новичок в таких инструментах, как JUnit, подумайте о TestNG, в долгосрочной перспективе он может оказаться более полезным для вас.

0 голосов
/ 25 мая 2011

Вероятно, некоторые данные, совместно используемые этими двумя методами, не инициализируются повторно в методе, помеченном @Before.

0 голосов
/ 25 мая 2011

Я бы рискнул предположить, что методы испытаний не устанавливают свою среду независимо. Таким образом, первый тест в рамках данного вызова java работает, но оставляет среду в другом состоянии, которое не подходит для следующего запуска теста.

Если вы устанавливаете важное состояние в статических блоках инициализатора или, возможно, в конструкторе теста, вы можете нарушить это. Важное состояние должно быть инициализировано либо как локальные переменные в методе тестирования, либо с помощью методов, помеченных @Before.

Вам следует подробнее остановиться на том, что означает "не получилось" - это второй из двух тестов, который случайно завершился неудачей, а первый, выполненный успешно?

0 голосов
/ 25 мая 2011

Возможно ли, что каждое состояние изменяет состояние системы (БД или некоторые статические поля и т. Д.), Но не очищает его надлежащим образом в методе @After?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...