45 votes

EasyMock : Comment créer un objet fantaisie d'une classe généralisée sans avertissement ?

Le code

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

me donne un avertissement "Type safety : L'expression de type SomeClass a besoin d'une conversion non vérifiée pour être conforme à SomeClass<Integer>".

42voto

Barend Points 8232

À ma connaissance, vous ne pouvez pas éviter l'avertissement non vérifié lorsqu'un nom de classe littéral est impliqué, et que l'option SuppressWarnings est la seule façon de gérer cela.

Notez qu'il est de bon ton de restreindre le champ d'application de l'option SuppressWarnings dans la mesure du possible. Vous pouvez appliquer cette annotation à une seule affectation de 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'aide :

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

12voto

J'ai contourné ce problème en introduisant une sous-classe, par ex.

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

Créez ensuite une copie de cette classe abstraite :

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

0 votes

En outre, n'oubliez pas d'utiliser la fonction org.easymock.classextension.EasyMock version d'EasyMock pour créer vos mocks lorsque vous utilisez la classe abstraite.

0 votes

À partir d'EasyMock 3.0 (mai 2010), les classes de la section org.easymock.classextension sont dépréciées et sont de simples substituts des classes du même nom dans le système org.easymock . Il est recommandé de supprimer ".classextension" de vos importations et d'arrêter de compiler avec la bibliothèque classextension.

3voto

Les deux solutions évidentes consistent à supprimer l'avertissement ou à créer une sous-classe.

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

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

0 votes

La syntaxe devrait probablement être : private static interface SomeClass_Integer extends SomeClass<Integer> {} J'ai le même problème et c'est le contournement que j'utilise, donc l'approche fonctionnera. Mais j'espère que quelqu'un a la réponse que nous recherchons.

2voto

Cem Catikkas Points 4986

Vous pouvez annoter la méthode de test avec @SuppressWarnings("unchecked") . Je suis d'accord pour dire que c'est une sorte de hack, mais à mon avis, c'est acceptable pour le code de test.

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

2 votes

Ouais, mais ça me laisse l'impression d'être bon marché

2 votes

Si vous suivez cette voie (en espérant qu'il y ait une meilleure solution), il est préférable de mettre l'avertissement @SuppressWarnings sur l'affectation de la variable plutôt que sur la méthode entière.

1voto

chim Points 1799

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

Il y a moins de code et il est plus facile de travailler avec, 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X