2014-12-16 3 views
12

Was ist der Unterschied zwischenEasyMock isA vs ANYOBJECT

EasyMock.isA(String.class) 

und

EasyMock.anyObject(String.class) 

(Oder irgendeine andere Klasse geliefert)

In welchen Situationen würde würden Sie einen über den anderen verwenden?

Antwort

17

Der Unterschied besteht darin, Nulls zu überprüfen. Das isA gibt false zurück, wenn null, aber anyObject auch für null zurückgibt.

import static org.easymock.EasyMock.*; 
import org.easymock.EasyMock; 
import org.testng.annotations.Test; 


public class Tests { 


    private IInterface createMock(boolean useIsA) { 
     IInterface testInstance = createStrictMock(IInterface.class); 
     testInstance.testMethod(
       useIsA ? isA(String.class) : anyObject(String.class) 
     ); 
     expectLastCall(); 
     replay(testInstance); 
     return testInstance; 
    } 
    private void runTest(boolean isACall, boolean isNull) throws Exception { 
     IInterface testInstance = createMock(isACall); 
     testInstance.testMethod(isNull ? null : ""); 
     verify(testInstance); 
    } 
    @Test 
    public void testIsAWithString() throws Exception { 
     runTest(true, false); 
    } 
    @Test 
    public void testIsAWithNull() throws Exception { 
     runTest(true, true); 
    } 
    @Test 
    public void testAnyObjectWithString() throws Exception { 
     runTest(false, true); 
    } 
    @Test 
    public void testAnyObjectWithNull() throws Exception { 
     runTest(false, false); 
    } 

    interface IInterface { 
     void testMethod(String parameter); 
    } 
} 

Im Beispiel sollte der TestIsAWithNull fehlschlagen.

+0

Ich denke, Sie haben Ihre runTest Methoden im Code rückwärts, aber ich verstehe, was Sie sagen! Vielen Dank! – emilyk

3

Ich habe wirklich mit EasyMock Dokumentation als EasyMock.isA() in API-Dokumentation verwechselt wird gesagt, ein Klassenobjekt zurück, auf dem er genannt wird, aber EasyMock Dokumentation (für ISA- (Klasse clazz)) sagt, dass

Entspricht, wenn der tatsächliche Wert eine Instanz der angegebenen Klasse oder eine Instanz einer Klasse ist, die die angegebene Klasse erweitert oder implementiert. Null gibt immer false zurück. Verfügbar für Objekte.

für ANYOBJECT() sagt, es

beliebigen Wert Spiele.

Sie können einen Blick auf Dokumentation haben hier

ohne spezifischen Unterschied zwischen diesen beiden Methoden erwähnt.

+0

Ich sah das, aber es war mir immer noch nicht klar. Bedeutet dies, dass anyObject() nur einer Instanz dieser Klasse entspricht und isA() einer Instanz dieser Klasse und allen Unterklassen entspricht? – emilyk

+0

hat es ausprobiert, anyObject() funktioniert auch für Unterklassen! – Vihar

+0

Also dann gibt es keinen Unterschied? – emilyk