自定义hamcrest的Matcher

自定义hamcrest Matcher

在Junit中使用assertThat方法的时候第二个参数是一个hamcrest的Matcher 让Junit断言具有了很高的灵活性和可扩展性。

这里扩展一个大小比较的Matcher

  1. 首先自定义一个Matcher继承hamcrest的org.hamcrest.BaseMatcher

  2. 分别实现matches 和 describeTo

    
        @Override
        public boolean matches(Object actual) {
            // 是否通过assert
        }
    
        @Override
        public void describeTo(Description description) {
         // 没有通过显示的信息
        }
    
  3. 在Junit使用即可

代码实现

功能: 实现一个大于 大于等于 小于 小于等于的Matcher

这里我使用了策略模式将具体的比较行为抽离成一个比较器,核心就是根据matches方法返回的boolean值判断是否断言成功


public class ComparatorMatcher<T extends Number> extends BaseMatcher<T> {
  public class ComparatorMatcher<T extends Number> extends BaseMatcher<T> {
    // 期望值
    private final T expected;

    private final Comparator<? super Number> comparator;

    private Object actual;

    public ComparatorMatcher(T expected, Comparator<Number> comparator) {
        this.expected = expected;
        this.comparator = comparator;
    }

    @Override
    public boolean matches(Object actual) {
        this.actual = actual;
        if (actual instanceof Number) {
            Number actualNum = (Number) actual;
            return comparator.compare(expected, actualNum);
        }
        throw new UnsupportedOperationException(" not a number ");
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(String.format(" compactor error expected %s  actual %s", String.valueOf(this.expected), String.valueOf(actual)));
    }

    @Factory
    public static <T extends Number> ComparatorMatcher<T> gt(T expected) {
        return new ComparatorMatcher<>(expected, new GtComparator<>(false));
    }

    @Factory
    public static <T extends Number> ComparatorMatcher<T> lt(T expected) {
        return new ComparatorMatcher<>(expected, new LtComparator<>(false));
    }

    @Factory
    public static <T extends Number> ComparatorMatcher<T> gte(T expected) {
        return new ComparatorMatcher<>(expected, new GtComparator<>(true));
    }

    @Factory
    public static <T extends Number> ComparatorMatcher<T> lte(T expected) {
        return new ComparatorMatcher<>(expected, new LtComparator<>(true));
    }
}

// 比较器接口
public interface Comparator<T extends Number> {
    boolean compare(T excepted, T actual);
}

// 大于比较器
public class GtComparator<T extends Number> implements Comparator<T> {
    private boolean isGte;

    public GtComparator(boolean isGte) {
        this.isGte = isGte;
    }

    @Override
    public boolean compare(T excepted, T actual) {
        if (isGte) {
            return actual.doubleValue() >= excepted.doubleValue();
        }
        return actual.doubleValue() > excepted.doubleValue();
    }
}

// 小于比较器
public class LtComparator<T extends Number> implements Comparator<T> {
    private boolean isLte;

    public LtComparator(boolean isLte) {
        this.isLte = isLte;
    }

    @Override
    public boolean compare(T excepted, T actual) {
        if (isLte) {
            return actual.doubleValue() <= excepted.doubleValue();
        }
        return actual.doubleValue() < excepted.doubleValue();
    }
}

// Junit 测试
public class TestCustomComparatorMatcher {

    @Test
    public void testMyMatcher() {
        assertThat(2, gt(1));
        assertThat(2, gte(2));
        assertThat(2, lt(4));
        assertThat(2, lte(4));
        assertThat(2, lte(2));
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值