2016-09-01 2 views
0

Я использую метод AssertJ extracting() с ядром lambdas Java8 и отображает некоторые поля в BigDecimal, а затем утверждая полученный массив. Но мне нужно сравнить BigDecimal, используя compareTo(), а не с equals() (из-за this). Как я могу это сделать?AssertJ: как утверждать BigDecimals с помощью compareTo вместе с extracting()

Пример:

Actual actual = performTest(); 

Assertions.assertThat(actual) 
    .extracting(
    Actual::getName, // returns String 
    Actual::getValue // returns BigDecimal 
) 
    .containsExactly(
    "abc",     // ok, String equals comparison 
    new BigDecimal("1.1") // NOT OK, equals comparison, but I need compareTo comparison 
); 

Изменить: Я ищу беглом способ сделать это, потому что, конечно, я могу разделить это на несколько отличается Утверждает и сравнить его таким образом, или поместить все в один гигантский Condition ,

ответ

0

Если решение @ assylias не работает, вы всегда можете использовать специальное условие.

assertThat(new BigDecimal("1.1")).has(new Condition<BigDecimal>() { 
     @Override 
     public boolean matches(BigDecimal s) { 
      return s.compareTo(new BigDecimal("1.1")) == 0; 
     } 
}); 

Оберните его в функциональный интерфейс для более сильного синтаксиса.

Edit: Использование кортежа экстрактор в вашем примере:

assertThat(foo).extracting("name", "value").has(new Condition<Object[]>() { 
     @Override 
     public boolean matches(Object[] value) { 
      return new BigDecimal("1.1").compareTo(value[1]); 
     } 
    }); 

Без кортежа экстрактор:

Assertions.assertThat(actual).has(actualValue("abc", new BigDecimal("1.1"))); 

// Hide this somewhere and import static :) 

public static Condition<Actual> actualValue(String expectedName, BigDecimal expectedValue) { 
    return new Condition<Actual>() { 
     @Override 
     public boolean matches(Actual value) { 
      return expectedName.equals(value.getName()) && value.getValue().compareTo(expectedValue) == 0; 
     } 
    }; 
} 
+0

У меня нет ни одного 'BigDecimal' для сравнения, но часть' extracting' генерирует нечто вроде Array или Tuple of '(String, BigDecimal)'. Как бы написать другой 'has()' для String (или просто использовать нормальные значения здесь) и для 'BigDecimal'? – jhyot

+0

В этом случае просто измените общий параметр из условия на состояние . И изменяет метод совпадений, чтобы взять параметр Object [] как параметр, используя только второй элемент массива в compartor. Поскольку это становится немного уродливым, вы можете создать для этого класс adhoc, чтобы ваш тест оставался однострочным. –

+0

Спасибо за редактирование. Это не компилируется, я должен использовать 'value [1]' для BigDecimal. Это становится более уродливым и уродливым;) – jhyot

0

Я использовал бы matches, если это один раз утверждение:

assertThat(actual).matches(a -> a.getName().equals("abc") && p.getValue().compareTo(new BigDecimal("1.1")) == 0); 

Если вы планируете повторно использовать это утверждение, я бы создал условие, предложенное @fabienbk.

+0

Спасибо! Поскольку это на самом деле 1 String и 3 BigDecimals, и это одноразовое утверждение, я просто пошел на 4 утверждения каждый в качестве своего собственного заявления. – jhyot

Смежные вопросы