java generics mocking easymock

java - EasyMock: ¿Cómo creo un simulacro de una clase genérica sin una advertencia?



generics mocking (5)

El código

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

me da una advertencia "Tipo de seguridad: la expresión de tipo SomeClass necesita conversión no verificada para cumplir con SomeClass <Integer>".


AFAIK, no puede evitar la advertencia no verificada cuando se trata de un literal de nombre de clase, y la anotación SuppressWarnings es la única forma de manejar esto.

Tenga en cuenta que es buena forma de reducir el alcance de la anotación SuppressWarnings tanto como sea posible. Puede aplicar esta anotación a una sola asignación de variable local:

public void testSomething() { @SuppressWarnings("unchecked") Foo<Integer> foo = EasyMock.createMock(Foo.class); // Rest of test method may still expose other warnings }

o usa un método de ayuda:

@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 }


Las dos rutas obvias son para suprimir la advertencia o simular una subclase.

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

(Descargo de responsabilidad: ni siquiera intenté compilar este código, ni he usado EasyMock).


Puede anotar el método de prueba con @SuppressWarnings("unchecked") . Estoy de acuerdo en que esto es algo así como un truco, pero en mi opinión es aceptable en el código de prueba.

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


Sé que esto va en contra de la pregunta, pero ¿por qué no crear una lista en lugar de una lista falsa?

Es menos código y más fácil trabajar con él, por ejemplo, si desea agregar elementos a la lista.

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

En lugar de

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


Trabajé alrededor de este problema mediante la introducción de una subclase, por ejemplo

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

Luego crea un simulacro de esa clase abstracta:

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