IT Share you

이 코드가 Hamcrest의 hasItems 컴파일을 사용하지 않는 이유는 무엇입니까?

shareyou 2021. 1. 7. 19:55
반응형

이 코드가 Hamcrest의 hasItems 컴파일을 사용하지 않는 이유는 무엇입니까?


이것이 컴파일되지 않는 이유는 무엇입니까?

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItems;

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, hasItems(expected));

댓글에서 복사 된 오류 :

cannot find symbol method assertThat(java.util.ArrayList<java.lang.Integer>, org.hamcreset.Matcher<java.lang.Iterable<java.util.ArrayList<java.lang.Integer>>>)

이 게시물을 직접 수정하려고 시도했습니다. 해결하기에 충분한 정보를 제공했습니다.

hasItems의 반환 값을 (원시) Matcher로 캐스팅하여 컴파일하도록 충분히 컴파일러에 제공 할 수 있습니다. 예 :

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, (Matcher) hasItems(expected));

다른 사람이 여전히 고통 받고있는 경우를 대비하여 ...

추가하려면 편집하십시오 : Arend가 아래에서 지적한 것처럼 찬성 투표에도 불구 하고이 대답은 잘못되었습니다. 올바른 대답은 hamcrest 기대 한, 정수의 배열로 예상 설정하는 것입니다 :

    ArrayList<Integer> actual = new ArrayList<Integer>();
    ArrayList<Integer> expected = new ArrayList<Integer>();
    actual.add(1);
    expected.add(2);
    assertThat(actual, hasItems(expected.toArray(new Integer[expected.size()])));

hasItems는 컬렉션에 일부 항목이 포함되어 있는지 확인합니다. 2 개의 컬렉션이 같지 않은지 확인합니다. 그냥 일반적인 같음 어설 션을 사용합니다. 따라서 assertEquals (a, b) 또는 assertThat 사용

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

ArrayList<Integer> actual = new ArrayList<Integer>();
ArrayList<Integer> expected = new ArrayList<Integer>();
actual.add(1);
expected.add(2);
assertThat(actual, is(expected));

또는 Iterable에 특정 순서로 항목이 포함되어 있는지 확인하는 contains Matcher를 사용합니다.

import static org.junit.Assert.assertThat;
import static org.hamcrest.Matchers.contains;

ArrayList<Integer> actual = new ArrayList<Integer>();
actual.add(1);
actual.add(2);
assertThat(actual, contains(1, 2)); // passes
assertThat(actual, contains(3, 4)); // fails

containsInAnyOrder대신 주문 사용에 신경 쓰지 않는 경우 .


ArrayList<Integer>와 (과) 비교 하고 int있습니다. 올바른 비교는 다음과 같습니다.

...
assertThat(actual, hasItem(2));

-- 편집하다 --

죄송합니다. 잘못 읽었습니다. 어쨌든, hasItems당신이 원하는 서명은 다음과 같습니다.

public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements)

즉, 가변 개수의 인수를받습니다. ArrayList<T>이 호환 되는지 확실하지 않습니다 . 여기서 추측 만하면됩니다. 쉼표로 산재 해있는 예상 목록에서 각 항목을 보내십시오.

assertThat(actual, hasItems(2,4,1,5,6));

-편집 2-

여기에 내 의견을 붙여 넣으면 Hamcrest를 사용하지 않고 원하는 것과 동등한 표현이 있습니다.

assertTrue(actual.containsAll(expected));

시험

assertThat(actual, hasItems(expected.toArray(new Integer[0])));

일치 자 서명을 충족합니다. 주위에 Eclipse가 없으므로 작동하지 않을 수 있습니다.


That error message looks like one produced by the javac compiler. I've found in the past that code written using hamcrest just won't compile under javac. The same code will compile fine under, say, the Eclipse compiler.

I think Hamcrest's generics are exercising corner cases in generics that javac can't deal with.


I just came across the same problem and the following trick worked for me:

  • use import static org.hamcrest.Matchers.hasItems
  • have the hamcrest library before junit in classpath (build path -> order and export)

You can get this error if you try to replace jUnit's hamcrest with a newer version. For example, using junit-dep together with hamcrest 1.3 requires that use assertThat from hamcrest instead of jUnit.

So the solution is to use

import static org.hamcrest.MatcherAssert.assertThat;

instead of

import static org.junit.Assert.assertThat;


For these cases when code does compile in Eclipse but javac shows errors please do help hamcrest by providing explicitly type parameter e.g. Matchers.hasItem()


ArrayList<Integer> expected = new ArrayList<Integer>();
expected.add(1);
expected.add(2);
hasItems(expected);

hasItems(T..t) is being expanded by the compiler to:

hasItems(new ArrayList<Integer>[]{expected});

You are passing a single element array containing an ArrayList. If you change the ArrayList to an Array, then your code will work.

Integer[] expected = new Integer[]{1, 2};
hasItems(expected);

This will be expanded to:

hasItems(1, 2);

ReferenceURL : https://stackoverflow.com/questions/1092981/why-doesnt-this-code-attempting-to-use-hamcrests-hasitems-compile

반응형