当前位置: 首页 > 知识库问答 >
问题:

Java:如何定义匿名Hamcrest匹配器?

百里修真
2023-03-14

我试图使用JUnit/Hamcrest断言集合至少包含一个自定义逻辑断言为true的元素。我希望有像“anyOf”这样的匹配器,它采用lambda(或匿名类定义),在这里我可以定义自定义逻辑。我试过TypeSafeMatcher,但不知道该怎么处理它。

我不认为任何一个是我想要的,因为这似乎需要一个匹配者的名单。

共有2个答案

井宪
2023-03-14

也许Matchers.has项目()可以帮助你?

List<String> strings = Arrays.asList("a", "bb", "ccc");

assertThat(strings, Matchers.hasItems("a"));
assertThat(strings, Matchers.hasItems("a", "bb"));

Matcher还有一种方法可以提供其他Matcher作为参数,即hasItems(Matcher

此外,还有一些方法在数组上工作hasItemInArray(T元素)和hasItemInArray(Matcher

鲁辉
2023-03-14

你在测试什么?有一个很好的机会,您可以使用匹配器的组合,如hasItemallOfhasProperty,否则您可以实现org.hamcrest.TypeSafeMatcher。我发现查看现有匹配器的源代码会有所帮助。我已经在下面创建了一个基本的自定义匹配器,它与一个属性相匹配

public static class Foo {
    private int id;
    public Foo(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
}

@Test
public void customMatcher() {
    Collection<Foo> foos = Arrays.asList(new Foo[]{new Foo(1), new Foo(2)});
    assertThat(foos, hasItem(hasId(1)));
    assertThat(foos, hasItem(hasId(2)));
    assertThat(foos, not(hasItem(hasId(3))));
}

public static Matcher<Foo> hasId(final int expectedId) {
    return new TypeSafeMatcher<Foo>() {

        @Override
        protected void describeMismatchSafely(Foo foo, Description description) {
            description.appendText("was ").appendValue(foo.getId());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Foo with id ").appendValue(expectedId);
        }

        @Override
        protected boolean matchesSafely(Foo foo) {
            // Your custom matching logic goes here
            return foo.getId() == expectedId;
        }
    };
}
 类似资料:
  • 问题内容: 我已经看到了几个与Java中类似的示例,希望有人可以解释发生了什么。似乎可以内联定义一个新类,这对我来说真的很奇怪。 第一行是预期的输出行,因为它只是toString。但是第二似乎函数可以内联重写。 为此有技术术语吗? 还是任何更深入的文档? 如果我有以下代码: 代码输出: 问题答案: 它是一个匿名内部类。您可以在Java文档内部类链接中找到有关它的更多信息。 编辑 我正在添加一个更好

  • 问题内容: 首次浏览Web应用程序时(通常在禁用缓存的浏览器中),我收到此错误。 错误:匿名define()模块不匹配:函数(要求){ HTML : JS : 谁能确切知道此错误的含义以及发生的原因? 问题答案: 就像AlienWebguy说,每文档,require.js可以炸毁如果 您在自己的脚本标签中有一个匿名的define(“ 调用define()的模块,没有字符串ID ”)(我假设它们实际

  • 它看起来像hamcrest(尽管看起来,还有更多)。为什么我会选择使用(除了看起来类稍微小一点之外),为什么这两个类如此相似?

  • 我试图在spock或hamcrest中编写一个与域相关的自定义断言/匹配器,但我不确定如何继续。 我曾尝试在hamcrest编写一个自定义匹配器,但到目前为止,这只导致我找到了部分解决方案。 我正在寻找一些指导,关于在这种情况下正确的路线是什么。 域对象: ResultMap有一个对象Map 在我的spock测试中,我想做的事情是: 然后,内部代码将评估每个条目,并对内部对象进行适当的测试。 到目

  • VOLUME 定义匿名卷 格式为: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以

  • 我需要检查是否一个url是有效的和空值是可接受的以及。我是这个图书馆的新手,被这个错误难倒了。