2012-12-20 2 views
6

Ich habe das Szenario folgendeGibt es etwas ähnlich wie Junit Setup-Methode in Mockito

interface DAO 
{ 
     String a(); 
     String b(); 
     String c(); 

} 

ich ein Mock dieser DAO-Schnittstelle erstellen und ich ihn an etwas namens DAOProcess. Innerhalb von DAOProcess habe ich verschiedene Methoden, um die DAO-Methoden a, b und c aufzurufen.

Jetzt jedes Mal, wenn ich eine Methode in DAOProcess Einheit testen muss, werde ich am Ende schreiben when(mockDAO.a()).thenReturn("test").

Kann ich diese when(mockDAO.a()).thenReturn("test") trotzdem in alle Testfälle verschieben?

Antwort

9

Wenn Ihre Testfälle werden alle in einer Klasse können Sie Verwendung eines Verfahrens mit @Before kommentierte machen, zum Beispiel:

... 
private DAO mockDAO; 

@Before 
public void setUp() { 
    mockDAO = mock(DAO.class); 
    when(mockDAO.a()).thenReturn("test"); 
    ...etc... 
}  
... 

Oder, wenn Sie das Verhalten über viele Testklassen benötigen, könnten Sie eine Dienstprogrammklasse schreiben, um das Verhalten für eine Mock-Instanz festzulegen, zB:

public class MockDAOPrototype { 
    public DAO getMockWithDefaultBehaviour() { 
     final DAO mockDAO = mock(DAO.class); 
     when(mockDAO.a()).thenReturn("test"); 
     ...etc... 

     return mockDAO; 
    } 
} 

Und dann rufen Sie MockDAOPrototype.getMockWithDefaultBehaviour() in Ihrer setUp Methode.

2

Sie können eine AbstractTestCase-Klasse erstellen, die abstract ist, und wird um alle Testfälle erweitert, in denen Sie diesen Schein benötigen. In diesem abstrakten Testfall erhalten Sie die folgenden Anweisungen.

@Ignore // just in case your runner thinks this is a JUnit test. 
public abstract class AbstractTestCase 
{ 
     @Mock 
     private DAO mockDAO; 

     @Before 
     private void setupMocks() 
     { 
      when(mockDAO.a()).thenReturn("test") 
      .... 
     } 
} 

In Ihrem konkreten Testfall-Klassen, würden Sie

public class MyConcreteTestCase extends AbstractTestCase 
{ 
     @InjectMocks 
     @Autowired 
     private DAOProcess daoProcess; 

     .... 
} 
+0

Ich würde die Autowired Annotation hier nicht verwenden, da es mit Feder Zeug verwirrend sein könnte. Selbst wenn DAOProcess in einem Spring-Kontext erstellt wurde, bin ich mir nicht sicher, dass es eine kluge Idee wäre, die Referenzen des Kollaborateurs durch Mocks zu ersetzen, während diese Strahlen immer noch vom Frühling verwaltet werden! – Brice