2008-09-11 8 views

Antwort

3

Die zwei offensichtlichen Routen sind, die Warnung zu unterdrücken oder eine Unterklasse zu verspotten.

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

(Haftungsausschluss: Nicht einmal versucht, diesen Code zu kompilieren, noch habe ich verwendet EasyMock.)

+0

Die Syntax sollte wohl sein: private static Schnittstelle SomeClass_Integer erweitert Someclass {} Ich habe das gleiche Problem, und das ist die Arbeit um ich so der Ansatz verwenden wird funktionieren. Aber ich hoffe, jemand hat die Antwort, die wir suchen. –

2

Sie können die Testmethode mit @SuppressWarnings("unchecked") mit Anmerkungen versehen. Ich stimme zu, dass dies etwas von einem Hack ist, aber meiner Meinung nach ist es im Testcode akzeptabel.

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

yeah, aber das lässt mich fühlen billig –

+2

Wenn Sie diese Route gehen (hoffentlich gibt es einen besseren Weg), viel besser, um die @SuppressWarnings auf die variable Zuweisung statt das Ganze zu setzen Methode. – SamBeran

39

AFAIK, können Sie die unkontrollierte Warnung nicht vermeiden, wenn ein Klassenname wörtlichen beteiligt ist, und die SuppressWarnings Anmerkung ist der einzige Weg, dies zu umgehen.

Beachten Sie, dass es eine gute Form ist, den Umfang der SuppressWarnings Annotation so weit wie möglich einzuschränken. Sie können diese Anmerkung zu einem einzigen lokalen Variablen Zuordnung gelten:

public void testSomething() { 

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

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

oder eine Hilfsmethode verwenden:

@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

ich durch die Einführung einer Unterklasse, um dieses Problem gearbeitet, z.B.

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

Dann ein Modell dieser abstrakten Klasse erstellen:

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

Vergessen Sie außerdem nicht, die 'org.easymock.classextension.EasyMock' Version von EasyMock zu verwenden, um Ihre Mocks zu erstellen, wenn Sie die abstrakte Klasse verwenden. – Andreas

+0

Ab EasyMock 3.0 (Mai 2010) sind die Klassen in 'org.easymock.classextension' veraltet und einfache Proxies für die gleichnamigen Klassen in' org.easymock'. Es wird empfohlen, ".classextension" von Ihren Importen zu entfernen und die Kompilierung mit der Classextension-Bibliothek zu beenden. – AndrewF

0

Ich weiß, dass dies die Frage geht gegen, aber warum nicht eine Liste eher als eine Mock Liste erstellen?

Es ist weniger Code und einfacher zu arbeiten, zum Beispiel wenn Sie Elemente zur Liste hinzufügen möchten.

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

Statt

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