EasyMock: Как создать макет обобщенного класса без предупреждения? - PullRequest
43 голосов
/ 11 сентября 2008

код

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

выдает мне предупреждение «Тип безопасности: выражение SomeClass нуждается в непроверенном преобразовании для соответствия SomeClass ».

Ответы [ 5 ]

41 голосов
/ 28 декабря 2008

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
}
11 голосов
/ 17 января 2012

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

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

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

MySpecial<String> myMock = createControl().createMock(MySpecialString.class);
3 голосов
/ 11 сентября 2008

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

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

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

2 голосов
/ 11 сентября 2008

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

@Test
@SuppressWarnings("unchecked")
public void someTest() {
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}
1 голос
/ 06 декабря 2013

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

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

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);
...