Hamcrest — Matchers.hasProperty: получение странной ошибки: java.lang.Ошибка утверждения: нет свойства «FirstName» и нет свойства «LastName»

#java #junit5 #hamcrest

#java #junit5 #hamcrest

Вопрос:

Я создал один элемент класса и хочу проверить, является ли свойство класса элемента «FirstName» «тестовым», а «LastName» «лучшим», но я получаю следующие ошибки. Я действительно не понимаю, что здесь не так. Я мало сомневаюсь, нужно ли делать следующие вещи или нет.

  1. Нужно ли мне перезаписывать метод equal для FirstName и LastName.
  2. Есть ли какие-либо шансы на конфликты jar
  3. Или я что-то упускаю

Заранее спасибо.

Вот мой код :

 @Test
  public void testName(){
    List<Item> items = new ArrayList<Item>();
    Item item1= new Item("test","best");
    Item item2= new Item("test","best");
    Item item3= new Item("test","best");
    items = Arrays.asList(item1,item2,item3);
    assertThat(items,hasItems(allOf(Matchers.<Item>hasProperty("firstName",is("test")),
        Matchers.<Item>hasProperty("lastName",is("best")))));
  }
  

элемент класса {

   public Item(){}
  public Item(String firstName,String lastName){
    this.firstName=firstName;
    this.lastName=lastName;
  }
  private String firstName;
  private String lastName;

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }

    if (obj.getClass() != this.getClass()) {
      return false;
    }

    final Item other = (Item) obj;
    if ((this.firstName == null) ? (other.firstName != null) : !this.firstName.equals(other.firstName)) {
      return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 53 * hash   (this.firstName != null ? this.firstName.hashCode() : 0);
    return hash;
  }
}
  

Я получаю следующую ошибку :

 Expected: (a collection containing (hasProperty("firstName", is "test") and hasProperty("lastName", is "best")))
     but: a collection containing (hasProperty("firstName", is "test") and hasProperty("lastName", is "best")) hasProperty("firstName", is "test") No property "firstName", hasProperty("firstName", is "test") No property "firstName", hasProperty("firstName", is "test") No property "firstName"
java.lang.AssertionError: 
Expected: (a collection containing (hasProperty("firstName", is "test") and hasProperty("lastName", is "best")))
     but: a collection containing (hasProperty("firstName", is "test") and hasProperty("lastName", is "best")) hasProperty("firstName", is "test") No property "firstName", hasProperty("firstName", is "test") No property "firstName", hasProperty("firstName", is "test") No property "firstName"
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
    at ImportTest.testName(ImportTest.java:220)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
  

Ответ №1:

Я, наконец, смог решить проблему. Проблема в том, что я создал класс Item в том же классе, и он не был общедоступным. Я создал свой класс Item как отдельный класс Java и сделал его общедоступным, и это сработало для меня.

 public class Item {

  public Item(){}
  public Item(String firstName,String lastName){
    this.firstName=firstName;
    this.lastName=lastName;
  }
  private String firstName;
  private String lastName;


// here is the public getter and setters

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }

    if (obj.getClass() != this.getClass()) {
      return false;
    }

    final Item other = (Item) obj;
    if ((this.firstName == null) ? (other.firstName != null) : !this.firstName.equals(other.firstName)) {
      return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 53 * hash   (this.firstName != null ? this.firstName.hashCode() : 0);
    return hash;
  }
}