2017-06-26 1 views
0

Ich möchte ClassA.mockMethod() aufrufen, wann immer objOfClassB.realMethod() Methode aufgerufen wird.So rufen Sie Mock-Methode anstelle von Real-Methode in Mockito/Juni

public class ClassA{ 
    public static int mockMethod(String url, MySql sql){ 
     int res=0 
     // do work 
     return ; 
    } 

} 

Definition of executeUpdate1() 
class Veps{ 
    protected synchronized int realMethod(String url, MySql sql){ 
    ---- 
    ----- 
    } 
} 

public class VepsTest { 
     public void setUp() throws Exception { 

      veps = mock(Veps.class); 

      when(objOfClassA.realMethod(any(String.class), any())).thenReturn(objOfClassB.mockMethod(any(String.class),any())); 
     } 
} 


org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
2 matchers expected, 4 recorded. 
This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

Antwort

1

die Mockito meldet die Fehler klar:

Ungültige Verwendung von Argument Matcher! 2 Matcher erwartet, 4 aufgezeichnet.

Sie sollten nicht Matcher s in irgendeiner then* Klausel verwenden. Ihr Problem kann behoben werden:

when(veps.executeQuery1(any(String.class), any(MySql.class))) 
    .thenReturn(DBConnection.mockExecuteQuery("??","??")); 

when(veps.executeUpdate1(any(String.class), any())) 
    .thenReturn(DBConnection.mockExecuteUpdate("??","??")); 

aber ein anderes Problem erscheint: warum brauchen haben Sie das Ergebnis aus der Datenbank abfragen? Sie können einfach einen konstanten Wert zu fälschen das Ergebnis nehmen:

when(veps.executeQuery1(any(String.class), any(MySql.class))) 
    .thenReturn(1); 
//    ^--- replace the constant 1 with yours 

when(veps.executeUpdate1(any(String.class), any())) 
    .thenReturn(1); 
//    ^--- replace the constant 1 with yours 

müssen Sie mockito documentation wie weiter sehen, bevor es in Ihrem Test.

+0

Danke für die Antwort. Ich ersetzt alle() mit "??" und die IDE gibt die Kompilierung Warnung --- "Die Methode mockExecuteQuery (String, MySql) im Typ DBConnection ist nicht anwendbar für die Argumente (String, String)" Ich muss die Mock-Methoden implementieren, anstatt die Antwort, da mein Test auf den Daten beruht, die eingefügt und gezogen werden .. Ich muss die Datenbank verspotten, aber das Verhalten einer echten Datenbank beibehalten –

+0

@SharatChandra Gar nicht. aber ich frage Sie immer noch: "** Warum mussten Sie das Ergebnis aus der Datenbank abfragen? **" –

+0

Der Code führt bestimmte Operationen auf der Datenbank aus. Mein Test muss validieren, ob die korrekten Daten in die Datenbank geschrieben wurden, ohne eine tatsächliche Datenbank zu verwenden –