2008-09-11 10 views

Répondre

3

Les deux voies évidentes sont de supprimer l'avertissement ou de simuler une sous-classe.

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

(non-responsabilité: même pas essayé de compiler ce code, et je n'ai utilisé EasyMock.)

+0

La syntaxe devrait probablement être: SomeClass_Integer interface statique privée étend SomeClass {} J'ai le même problème et c'est le travail autour Je l'utilise donc l'approche marchera. Mais j'espère que quelqu'un a la réponse que nous cherchons –

2

Vous pouvez annoter la méthode d'essai avec @SuppressWarnings("unchecked"). Je suis d'accord c'est un peu un hack mais à mon avis c'est acceptable sur le code de test.

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

oui, mais cela me laisse sentir bon marché –

+2

Si vous allez cette route (j'espère qu'il y a un meilleur moyen), beaucoup mieux de mettre le @SuppressWarnings sur l'affectation des variables plutôt que l'ensemble méthode. – SamBeran

39

AFAIK, vous ne pouvez pas éviter l'avertissement décoché est impliqué un nom de classe littérale, et l'annotation SuppressWarnings est la seule façon de gérer cela.

Notez que c'est une bonne forme pour réduire autant que possible la portée de l'annotation SuppressWarnings. Vous pouvez appliquer cette annotation à une seule cession variable locale:

public void testSomething() { 

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

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

ou utiliser une méthode d'assistance:

@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

J'ai travaillé autour de ce problème en introduisant une sous-classe, par exemple

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

Créez ensuite une maquette de cette classe abstraite:

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

De plus, n'oubliez pas d'utiliser la version 'org.easymock.classextension.EasyMock' d'EasyMock pour créer vos faux-semblants lors de l'utilisation de la classe abstraite. – Andreas

+0

À partir de EasyMock 3.0 (mai 2010), les classes dans 'org.easymock.classextension' sont obsolètes et sont de simples proxys pour les classes du même nom dans' org.easymock'. Il est recommandé de supprimer ".classextension" de vos importations et d'arrêter la compilation avec la bibliothèque classextension. – AndrewF

0

Je sais que cela va à l'encontre de la question, mais pourquoi ne pas créer une liste plutôt qu'une liste Mock?

C'est moins de code et plus facile à utiliser, par exemple si vous voulez ajouter des éléments à la liste.

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

Au lieu de

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