Подтвердить что ты не робот

EasyMock: Как создать макет обобщенного класса без предупреждения?

Код

private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);

дает мне предупреждение "Тип безопасности: выражение типа SomeClass требует необработанного преобразования, чтобы соответствовать SomeClass <Integer> ".

4b9b3361

Ответ 1

AFAIK, вы не можете избежать непроверенного предупреждения, когда используется литерал класса, и аннотация SuppressWarnings - это единственный способ справиться с этим.

Обратите внимание, что это хорошая форма, чтобы максимально сузить область аннотации SuppressWarnings. Вы можете применить эту аннотацию к одному локальному назначению переменных:

public void testSomething() {

    @SuppressWarnings("unchecked")
    Foo<Integer> foo = EasyMock.createMock(Foo.class);

    // Rest of test method may still expose other warnings
}

или используйте вспомогательный метод:

@SuppressWarnings("unchecked")
private static <T> Foo<T> createFooMock() {
    return (Foo<T>)EasyMock.createMock(Foo.class);
}

public void testSomething() {
    Foo<String> foo = createFooMock();

    // Rest of test method may still expose other warnings
}

Ответ 2

Я работал над этой проблемой, введя подкласс, например

private abstract class MySpecialString implements MySpecial<String>{};

Затем создайте макет этого абстрактного класса:

MySpecial<String> myMock = createControl().createMock(MySpecialString.class);

Ответ 3

Два очевидных маршрута - это подавление предупреждения или подделка подкласса.

private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
    someClass = EasyMock.createMock(SomeClass_Integer.class);

(Отказ от ответственности: даже не пыталась скомпилировать этот код, и я не использовал EasyMock.)

Ответ 4

Вы можете аннотировать метод тестирования с помощью @SuppressWarnings("unchecked"). Я согласен, что это какой-то хак, но, на мой взгляд, это приемлемо для тестового кода.

@Test
@SuppressWarnings("unchecked")
public void someTest() {
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}

Ответ 5

Я знаю, что это противоречит вопросу, но почему бы не создать список, а не список Mock?

Это меньше кода и проще работать, например, если вы хотите добавить элементы в список.

MyItem myItem = createMock(myItem.class);
List<MyItem> myItemList = new ArrayList<MyItem>();
myItemList.add(myItem);

Вместо

MyItem myItem = createMock(myItem.class);
@SuppressWarnings("unchecked")
List<MyItem> myItemList = createMock(ArrayList.class);
expect(myItemList.get(0)).andReturn(myItem);
replay(myItemList);