2009-08-13 12 views
2

Ich bin gerade in die Welt von easymock.i gekommen frage mich, ob easymock nur Mock-Objekt für Interfaces macht? Also in meinem Bemühen zu verstehen, ich schrieb eine Klasse zu generieren einzigartige Gutschein in java.i kann natürlich nicht wissen, welchen Wert es generiert, um in der Assert stuff.So wie sicherstellen, dass der generierte Gutschein vom Typ lang ist?verifiziere Objekttyp mit easymock

hier ist die Funktion

public static Long generateID(int length) { 
    logger.info("Calling generateID with specify length"); 
    Long result = null; 

    if (length > 0) { 
     StringBuffer id = new StringBuffer(length); 
     for (int i = 0; i < length; i++) { 
      id.append(NUMS[(int)Math.floor(Math.random() * 20)]); 
     } 
     result = Long.parseLong(id.toString()); 
    } 

    return result; 
} 

hier wird die Testklasse

@Before 
public void setUp() { 
    mockgenerator = createMock(VGenerator.class); 
} 


/** 
* Test of generateID method, of class VGenerator. 
*/ 
@Test 
public void testGenerateID() { 
    Long exp = (long)1; 
    int length = 15; 
    expect(mockgenerator.generateID(length)).equals(Long.class); 
    replay(mockgenerator); 
    long res = mockgenerator.generatedID(length); 
    assertEquals(exp.class, res.class); 
} 

auch dies für Sie aussehen könnte grandios, aber ich bin immer noch verwirrt darüber, wie dieses dank tun

für die Unterstützung
+0

Wenn generateID() versucht, etwas zurückzugeben, das nicht lange war, würde die Klasse nicht einmal kompilieren. –

Antwort

0

Wenn es absolut entscheidend ist, dass der Rückgabetyp long ist und Sie sicherstellen möchten, dass zukünftige Änderungen dies nicht versehentlich ändern, benötigen Sie kein easymock. Genau dies tun:

@Test 
public void TestGenerateIDReturnsLong() 
{ 
    Method method = 
     VGenerator.class.getDeclaredMethod("generateID", new Class[0]); 
    Assert.Equals(long.Class, method.GetReturnType()); 
} 

Derzeit sind Sie ein Mock-Implementierung von VGenerator zu erzeugen und Sie dann die Mock testen. Dies ist nicht nützlich. Der Point of Unit Testing dient dazu, eine reale Implementierung zu testen. Jetzt fragen Sie sich vielleicht, wofür Mocks gut sind?

Als Beispiel vorstellen, dass VGenerator einen Zufallszahlengenerator intern verwenden muss, und Sie dies im Konstruktor bereitstellen (die „Dependency Injection“ genannt wird):

public VGenerator 
{ 
    private final RandomNumberGenerator rng; 

    // constructor 
    public VGenerator(RandomNumberGenerator rng) 
    { 
     this.rng = rng; 
    } 

    public long generateID(length) 
    { 
     double randomNumber = this.rng.getRandomNumber(); 
     // ... use random number in calculation somehow ... 
     return id; 
    } 
} 

Wenn VGenerator Implementierung Sie sind nicht wirklich daran interessiert, den Zufallszahlengenerator zu testen. Was Sie interessiert, ist, wie VGenerator den Zufallszahlengenerator aufruft und wie er die Ergebnisse zur Ausgabe verwendet. Was Sie wollen, ist die volle Kontrolle über den Zufallszahlengenerator für die Zwecke der Prüfung zu nehmen, so dass Sie erstellen ein Modell davon :

@Test 
public void TestGenerateId() 
{ 
    RandomNumberGenerator mockRNG = createMock(RandomNumberGenerator.class); 
    expect(mockRNG.getRandomNumber()).andReturn(0.123); 
    replay(mockRNG); 

    VGenerator vgenerator = new VGenerator(mockRNG); 
    long id = vgenerator.generateID(); 
    Assert.Equals(5,id); // e.g. given random number .123, result should be 5 

    verify(mockRNG); 
} 
+0

ich schätze die erklärung.danke –

3

Ich glaube, Sie missverstehen, wie easymock verwendet wird, Aufruf erwartet, erzählt das Mock-Objekt, dass, wenn Sie es wiedergeben, dies Anruf sollte angerufen werden. Appending .andReturn() Weist das Mock-Objekt an zurückzugeben, was auch immer Sie dort eingeben, in meinem Beispiel ein langer Wert von 1. Der Punkt von easymock ist, dass Sie die mocked Schnittstelle nicht implementieren müssen, um die Klassen zu testen, die es verwenden . Durch Mocking können Sie eine Klasse von den Klassen isolieren, von denen sie abhängt, und nur den enthaltenen Code der Klasse testen, die Sie gerade testen.

Wenn ich deine Frage missverstanden habe und es wirklich war, macht Easymock nur Mock Interfaces? dann ist die Antwort ja, Easymock spottet nur Interfaces. Weitere Informationen finden Sie in der Dokumentation. Easymock

+0

sehr gute erklärung.Ich mag es.danke –

0

EasyMock Class extension können Klassen verspotten. Es ist eine Erweiterung von EasyMock. Es kann immer noch Schnittstelle verspotten, also ist es so ziemlich ein Ersatz für EasyMock.

In Ihrem Fall versuchen Sie jedoch, eine statische Methode zu verspotten. Die statische Methode kann nicht verspottet werden, da sie nicht überlastet werden kann. Sie benötigen dafür eine Klasseninstrumentierung, was EasyMock nicht tut.