#java #junit5 #hamcrest
#java #junit5 #hamcrest
Вопрос:
Я создал один элемент класса и хочу проверить, является ли свойство класса элемента «FirstName» «тестовым», а «LastName» «лучшим», но я получаю следующие ошибки. Я действительно не понимаю, что здесь не так. Я мало сомневаюсь, нужно ли делать следующие вещи или нет.
- Нужно ли мне перезаписывать метод equal для FirstName и LastName.
- Есть ли какие-либо шансы на конфликты jar
- Или я что-то упускаю
Заранее спасибо.
Вот мой код :
@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;
}
}