junit.Assert.assertTrue не удается, но только когда я компилирую модуль? - PullRequest
0 голосов
/ 07 февраля 2019

Сводка

Проверка модульного теста (junit.Assert.assertTrue) не выполняется, только когда я компилирую модуль (mvn clean install).Тем не менее, это не дает сбоя, если я запускаю JUnit тесты на Eclipse, и когда я вижу, что делает функция, я не могу понять, почему компиляция не удалась.Кто-нибудь имеет какие-либо идеи о том, как я могу решить, что происходит не так?

Ниже приведены подробности для заинтересованных читателей :)

Функция для проверки:

У меня есть функция со следующим телом:

public static boolean isBatchOfProducts(List<?> products) {
    boolean areBatches = (products != null && products.size() != 0);
    for (Object product : products) {
        areBatches = areBatches && product instanceof XmlProducts;
        if (areBatches) {
            XmlProducts xmlProducts = (XmlProducts)product;
            areBatches = areBatches && !xmlProducts.getXmlProduct().isEmpty();              
        }
    }
    return areBatches;
}

Цель функции - вернуть true/false, учитывая общий ввод List<?> products:

  • Если этот список не null или empty ...
  • ... если каждый объект этого списка является экземпляром XmlProducts ...
  • ... и если для каждого экземпляра XmlProducts список XmlProduct содержитне пусто ...

... тогда функция должна возвращать true, false в любом другом случае.

Модульный тест

Чтобы охватить это поведение, я добавил несколько модульных тестов, и один из них следующий:

@Test
public void testListOfOneEmptyXmlProducts() {
    List<Object> listToPrice = BatchPricingHelper.createPricingApiInputEmptyBatchXmlProducts();
    assertTrue(!ProductUtils.isBatchOfProducts(listToPrice));
}

Вывод, полученный из BatchPricingHelper.createPricingApiInputEmptyBatchXmlProducts(), как следует из названия, этопросто List<?>, содержащий только один XmlProducts, в списке которого нет XmlProduct (getXmlProduct() пусто).

Когда я запускаю из Eclipse

Я легко вижу, что юнит тест зеленыйне соответствует всем критериям, чтобы быть партией продуктов, поэтому функция возвращает false и I assertTrue на !false:

enter image description here

Когда я компилирую из Maven

Если я компилирую модуль, используя Maven, в частности команду mvn clean install в каталоге, я получаю следующую ошибку:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running mycompany.sdk.pricing.impl.PricingSessionTest
Tests run: 15, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.311 sec <<< FAILURE! - in mycompany.sdk.pricing.impl.PricingSessionTest
testListOfOneEmptyXmlProducts(mycompany.sdk.pricing.impl.PricingSessionTest)  Time elapsed: 0.004 sec  <<< FAILURE!
java.lang.AssertionError:
        at org.junit.Assert.fail(Assert.java:91)
        at org.junit.Assert.assertTrue(Assert.java:43)
        at org.junit.Assert.assertTrue(Assert.java:54)
        at mycompany.sdk.pricing.impl.PricingSessionTest.testListOfOneEmptyXmlProducts(PricingSessionTest.java:279)

... вызывая, конечно, BUILD FAILURE.Я попытался добавить в модульное тестирование все тело функции, которую я тестирую, и распечатать каждый вывод, чтобы увидеть, где оценка не удалась:

@Test
public void testListOfOneEmptyXmlProducts() {
    List<Object> listToPrice = BatchPricingHelper.createPricingApiInputEmptyBatchXmlProducts();
    boolean areBatches = (listToPrice != null && listToPrice.size() != 0);
    System.out.println("list not null and not empty: " + areBatches);
    for (Object product : listToPrice) {
        areBatches = areBatches && product instanceof XmlProducts;
        System.out.println("product is instance of XmlProducts: " + areBatches);
        if (areBatches) {
            XmlProducts xmlProducts = (XmlProducts)product;
            areBatches = areBatches && !xmlProducts.getXmlProduct().isEmpty(); 
            System.out.println("list of XmlProduct is not empty: " + areBatches);
        }
    }
    System.out.println("Final result: " + areBatches);
    assertTrue(!ProductUtils.isBatchOfProducts(listToPrice));
}

Странно, что яв выводе командной строки можно увидеть, что каждая оценка идет хорошо, и на самом деле это просто assertTrue, который не работает:

Running mycompany.sdk.pricing.impl.PricingSessionTest
list not null and not empty: true << CORRECT!
product is instance of XmlProducts: true << CORRECT!
list of XmlProduct is not empty: false << CORRECT, THE LIST IS EMPTY!
Final result: false << CORRECT, IT SHOULD RETURN FALSE!

---BUT STILL THE FAILURE BELOW!---

Tests run: 15, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.311 sec <<< FAILURE! - in mycompany.sdk.pricing.impl.PricingSessionTest
testListOfOneEmptyXmlProducts(mycompany.sdk.pricing.impl.PricingSessionTest)  Time elapsed: 0.004 sec  <<< FAILURE!
java.lang.AssertionError:
        at org.junit.Assert.fail(Assert.java:91)
        at org.junit.Assert.assertTrue(Assert.java:43)
        at org.junit.Assert.assertTrue(Assert.java:54)
        at mycompany.sdk.pricing.impl.PricingSessionTest.testListOfOneEmptyXmlProducts(PricingSessionTest.java:279)

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Наконец, это была просто проблема компиляции.

  • Я написал функцию isBatchOfProducts() в классе ProductUtils, который был в другом проекте Maven (скажем, Project X)
  • Я написал модульный тест testListOfOneEmptyXmlProducts()в проект Y
  • Благодаря этому модульному тесту я обнаружил ошибку и изменил код isBatchOfProducts()
  • Я перезапустил модульный тест, и он был зеленым (потому чтоEclipse, по-видимому, закулисно компилировал изменения, которые я сделал в Project X)
  • Я пытался скомпилировать Project Y, но он не удался, потому что все еще указывал на старую версию .jar

В принципе, это не проблема.Не забывайте всегда перекомпилировать то, что вы меняете:)

0 голосов
/ 07 февраля 2019

А как насчет скобок: assertTrue(!(ProductUtils.isBatchOfProducts(listToPrice)));?

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