2016-08-16 1 views
4

У меня есть определенный метод, который предоставляет объект Restriction (где Restriction - это интерфейс). И поскольку его реализация уже является testet, я просто хочу проверить, действительно ли мой метод предоставляет объект RestrictionImpl.
Я видел, что есть сокеты, которые я могу использовать вместе с assertThat, и я подумал, что для этой задачи нужен предмет isA.Как использовать isA-Matcher

Упрощенный мой код выглядит следующим образом:

public static Restriction getRestriction() { 
    return new RestrictionImpl(); 
} 

и мой тест выглядит так;

@Test 
public void getRestriction_returnsRestrictionImpl() { 
    assertThat(getRestriction(), isA(RestrictionImpl.class)); 
} 

Однако это не скомпилируется. Все, что я мог сделать, это проверить, если RestrictionImpl - это Restriction ... но в этом нет никакого смысла.

Неужели я не понимаю цели isA? И для чего это необходимо?

UPDATE:
Использование assertThat(getRestriction(), is(instanceOf(RestrictionImpl.class))) будет работать, но я думал, что isA ярлык именно для этой цели.
Вызов assertThat в том, как я хочу требует его иметь подпись assertThat(T, Matcher<? extends T>), но его подпись assertThat(T, Matcher<? super T>)

+0

Я думаю, что вы имеете в виду 'assertThat (getRestriction(). GetClass(), isA (RestrictionImpl.class))' или 'assertThat (getRestriction(), isA (instanceOf (RestrictionImpl.class))). – PEdroArthur

+0

оба не скомпилируются. Hower testing 'assertThat (getRestriction(), is (instanceOf (RestrictionImpl.class))' будет работать, но я, хотя 'isA' является ярлыком к этому. – danielspaniol

+0

Подпись assertThat является' assertThat (T actual, Matcher matcher) ' требует, чтобы тип Matcher был равен . Но в вашем коде 'RescrictionImpl.class' не является типом' Rescriction.class', поэтому компиляции не удалось. Чтобы решить эту проблему, вы можете либо изменить свой код на 'assertThat (getRestriction(), isA (Restriction.class)); или изменить подпись getRestriction на 'public static RestrictionImpl getRestriction()'. – walsh

ответ

4

Я нашел проблему, описывающую мою проблему:
https://github.com/hamcrest/JavaHamcrest/issues/27

И это выглядит как isA просто имеет неправильную подпись в этой версии JUnit. Он предназначен для быстрого доступа к is(isIntanceOf(...)), но это не так.

2

Возможно, вы хотите использовать instanceOf. И вы знаете, все эти вещи доступны в открытом доступе. Где isA ... должно быть именно то, что вам нужно. Таким образом, проблема может быть: у вас есть необходимая библиотека ячеек ядра hamcrest в вашей настройке проекта? Другими словами: может быть, вы должны прочитать это here.

И только несколько примеров кода, от одного из моих собственных проектов:

import static org.hamcrest.CoreMatchers.instanceOf; 
import static org.hamcrest.CoreMatchers.is; 
import static org.junit.Assert.assertThat; 
... 
@Test 
public void testWhatever() throws IOException, ApiException { 
    try { ... 
     fail("should have thrown"); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); // as expected 
     assertThat(e.getCause(), is(instanceOf(SomeClass.class))); 

Итак, у вас есть эти импортные там? У вас есть библиотеки в настройках вашего проекта, чтобы вернуть их обратно?

+0

"isA (java.lang.Class ) Ярлык для часто используемого является (instanceOf (SomeClass.class)).« – danielspaniol

+0

Мне также было интересно узнать подпись' assertThat', так как это 'assertThat (T, Matcher ', но я хочу использовать его как 'assertThat (T, Matcher ' – danielspaniol

+0

Еще несколько обновлений ... – GhostCat