Nano Hash - криптовалюты, майнинг, программирование

соответствующий список в любом порядке при насмешливом поведении метода с помощью Mockito

У меня есть тест с использованием Mockito, который ведет себя очень странно: он работает в режиме отладки, но не работает при нормальной работе. После некоторого расследования я понял, что это потому, что я издеваюсь над поведением методов, передавая список элементов для сопоставления. Но по какой-то причине порядок в списке не всегда одинаков, поэтому он не совпадает, и то, что я ожидаю, что мой макет вернет, не возвращается, потому что 2 списка не "равны"

 when(mockStatusCalculatorService.calculateStatus(Arrays.asList(IN_PROGRESS, ABANDONNED,EXPIRED))).thenReturn(ConsolidatedStatus.EXPIRED);

В моем случае порядок элементов не имеет значения. Итак, как я могу указать это при настройке моего макета?


Ответы:


1

Это однострочный. Используйте сопоставитель Hamcrest containsInAnyOrder.

when(myMock.myMethod(argThat(containsInAnyOrder(IN_PROGRESS, ABANDONED, EXPIRED))))
    .thenReturn(myValue);
30.11.2016
  • да, вы правы .. следует отметить, что преобразование вывода argThat в ожидаемый тип с помощью метода кажется обязательным в большинстве случаев 28.12.2016
  • если у меня нет Hamcrest, только mockito? 27.05.2018
  • Не думаю, что это лучшее решение, но я обошел эту проблему, указав несколько операторов when. Если вы просто пытаетесь пройти тест, это, вероятно, самый простой способ (если у вас небольшое количество предметов в коллекции)! 21.10.2020

  • 2

    Добавление ответа для более новых версий Mockito и Java 8

    when(
       mock.method(argThat(t -> t.containsAll(Arrays.asList(IN_PROGRESS, ABANDONED, EXPIRED))))
    ).thenReturn(myValue);
    
    27.05.2018

    3

    это на самом деле довольно просто. нам нужен пользовательский сопоставитель:

    import org.apache.commons.collections.CollectionUtils;
    import org.mockito.ArgumentMatcher;
    import java.util.List;
    import static org.mockito.Matchers.argThat;
    
    public class InAnyOrderListMatcher extends ArgumentMatcher<List> {
    
    private final List expected;
    
    public InAnyOrderListMatcher(List expected){
        this.expected=expected;
    }
    
    @Override
    public boolean matches(Object actual) {
    
        if(actual instanceof List){
    
            List actualList=(List)actual;
    
            return CollectionUtils.isEqualCollection(expected,actualList);
    
        }
    
        return false;
    }
    
    public static List inAnyOrderListMatcherEq(List expected) {
        return argThat(new InAnyOrderListMatcher(expected));
    }
    
    }
    

    А затем вызовите его в тесте:

    when(mockStatusCalculatorService.calculateStatus( inAnyOrderListMatcherEq(Arrays.asList(IN_PROGRESS, ABANDONNED,EXPIRED)))).thenReturn(ConsolidatedStatus.EXPIRED);
    
    30.11.2016
  • Не изобретайте велосипед. У Hamcrest уже есть сопоставитель для этого. Смотрите мой ответ. 30.11.2016

  • 4

    Если порядок не имеет значения, измените службу StatusCalculator, чтобы она принимала Set вместо Collection. Тогда equals вернет true независимо от порядка.

    Лучше исправить свой API, чем обходить его в своих модульных тестах.

    29.06.2020
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..