如何在具有多个参数的 JsonUnit 中创建匹配器

问题描述

我想创建一个具有多个参数的自定义匹配器(例如 isBetween),并将其用于 JsonUnit 中的比较。我该怎么做?

解决方法

它类似于 matcher with one value

Matcher<?> betweenMatcher = new BetweenMatcher();
assertThatJson("{\"test\": 3.14}")
    .withMatcher("isBetween",betweenMatcher)
    .isEqualTo("{\"test\":\"${json-unit.matches:isBetween}3.1,3.2\"}");
 ...

private static class BetweenMatcher extends BaseMatcher<Object> implements ParametrizedMatcher {
    private BigDecimal lowerBound;
    private BigDecimal upperBound;

    public boolean matches(Object item) {
        if (!(item instanceof BigDecimal)) {
            return false;
        }
        BigDecimal actualValue = (BigDecimal) item;
        return actualValue.compareTo(lowerBound) >= 0 && actualValue.compareTo(upperBound) <= 0;
    }

    public void describeTo(Description description) {
        description.appendValue(lowerBound).appendText(" and ").appendValue(upperBound);
    }

    @Override
    public void describeMismatch(Object item,Description description) {
        description.appendText("is not between ").appendValue(lowerBound).appendText(" and ").appendValue(upperBound);
    }

    public void setParameter(String parameter) {
        String[] tokens = parameter.split(",");
        this.lowerBound = new BigDecimal(tokens[0].trim());
        this.upperBound = new BigDecimal(tokens[1].trim());
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...