使用hamcrest声明我得到了一个对象集合,并且其中一个属性设置为特定值?

时间:2014-10-24 10:59:55

标签: java junit assert hamcrest

我刚开始使用Hamcrest,所以我可能做错了。

我有List<Foo> foosFoo界面看起来有点像这样:

public abstract interface Foo {

  public String getBar();

}

impl.FooImpl

实施
public class FooImpl implements Foo {

  protected String _bar = "some value";

  public String getBar() {
    return _bar;
  }

}

我的断言看起来像这样:

assertThat(
  foos, 
  Matchers.hasItem(
    Matchers.<Foo> hasProperty(
      "bar", 
      equalTo("some value")
    )
  )
);

不幸的是,JUnit / Hamcrest并不高兴:

java.lang.AssertionError: 
Expected: a collection containing hasProperty("bar", "someValue")
     got: <[com.example.impl.FooImpl@2c78bc3b]>

知道我需要做些什么才能解决这个问题?

更新:我的“测试”课程就在这里:

public class FooTest {
  public static void main(String... args) throws Exception {
    List<Foo> foos = Arrays.<Foo> asList(new FooImpl());
      assertThat(
        foos, 
        Matchers.<FooImpl> hasItem(Matchers.hasProperty("bar", equalTo("some value")))
      );
  }
}

显然,我希望看到的是断言传递而不会出现例外......:)

更新:现在已修复;我刚刚在IntelliJ中设置了一个空白的maven项目,它运行良好。它可能是一个错字,或者我在Eclipse中导入错误的方法,但它肯定是OSI第8层问题。我要求关闭谈话。对不起大家,谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您发布的代码运行正常。您遇到的错误是由于您在本地运行的代码中的"someValue""some value"不匹配。升级到Hamcrest 1.3,您将收到更清晰的错误消息:

Expected: a collection containing hasProperty("bar", "someValue")
    but: property 'bar' was 'some value'

由于你可能得到不同的结果,这里有一个完整的例子,通过JUnit 4.11和Hamcrest 1.3。在Foo.java

public class Foo {
    public String getBar() {
        return "some value";
    }
}

FooTest.java

import static org.junit.Assert.assertThat;

import java.util.Arrays;
import java.util.List;

import org.hamcrest.Matchers;
import org.junit.Test;

public class FooTest {
    @Test
    public void test() {
        List<Foo> foos = Arrays.asList(new Foo());

        assertThat(foos,
                Matchers.<Foo>hasItem(Matchers.hasProperty("bar", Matchers.equalTo("some value"))));
    }
}

如果我故意通过将测试中的属性名称更改为"notbar"来破解此测试,那么我得到:

java.lang.AssertionError: 
Expected: a collection containing hasProperty("notbar", "some value")
     but: No property "notbar"

相反,如果我通过期待"some other value"来打破它,那么我得到:

java.lang.AssertionError: 
Expected: a collection containing hasProperty("bar", "some other value")
     but: property 'bar' was "some value"

如果您遇到不同或不太清楚的错误,则可能会遇到另外的问题。