2008-09-11 22 views

Respuesta

3

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

(Negación: Ni siquiera trató de compilar este código, ni he utilizado EasyMock.)

+0

La sintaxis probablemente debería ser: privada SomeClass_Integer interfaz estático se extiende SomeClass {} tengo el mismo problema y este es el trabajo en torno a que utilizo lo que el enfoque trabajará. Pero espero que alguien tenga la respuesta que buscamos –

2

puede anotar el método de ensayo 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); 
} 
+2

, sí, pero eso me hace sentir barato –

+2

Si vas por esta ruta (con suerte hay una mejor), es mucho mejor poner @SuppressWarnings en la asignación de variables en lugar de la totalidad método. – SamBeran

39

yo sepa, no se puede evitar el aviso sin control cuando un nombre de clase literal está involucrado, y la SuppressWarnings anotación es la única manera 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 variable local:

public void testSomething() { 

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

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

o usar 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 
} 
11

trabajé en torno a este problema mediante la introducción de una subclase, por ejemplo,

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

continuación, crear una maqueta de esa clase abstracta:

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

Además, no olvide utilizar la versión 'org.easymock.classextension.EasyMock' de EasyMock para crear sus simulaciones cuando use la clase abstracta. – Andreas

+0

A partir de EasyMock 3.0 (mayo de 2010), las clases en 'org.easymock.classextension' están en desuso y son simples proxies para las clases con el mismo nombre en' org.easymock'. Se recomienda eliminar ".classextension" de sus importaciones y detener la compilación con la biblioteca classextension. – AndrewF

0

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

Es menos código y más fácil de trabajar, 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); 
Cuestiones relacionadas