2014-06-09 12 views
5

Ich bin neu in Frühling und nur etwas mit JUnit und Mockito erfahrenFrühling jdbcTemplate Unit-Tests

ich die folgende Methode haben, die einen Komponententest erfordert

public static String getUserNames(final String userName { 
    List<String> results = new LinkedList<String>(); 
    results = service.getJdbcTemplate().query("SELECT USERNAME FROM USERNAMES WHERE NAME = ?", new RowMapper<String>() { 
     @Override 
     public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
      return new String(rs.getString("USERNAME"); 
     } 
    } 

    return results.get(0);  
    },userName) 

jemand auf irgendwelche Vorschläge Hat, wie ich könnte Erreichen Sie dies mit JUnit und Mockito?

Vielen Dank im Voraus!

+1

Sie müssen den Testanwendungskontext definieren, der von SpringJUnit4ClassRunner abgerufen wird. Wie Sie sehen, versuchen Sie, einen Integrationstest und keinen Komponententest durchzuführen. Dies sind zwei verschiedene Dinge. – Vaelyr

+1

Welche Aspekte der Methode möchten Sie testen?Welche Tests hast du versucht zu schreiben? Zeigen Sie etwas Arbeit. –

+0

Sie können sich [Acolyte] (http://acolyte.eu.org/) Framework für JDBC-Komponententests ansehen – cchantep

Antwort

7

zu helfen Wenn Sie eine reine Einheit Test machen wollen, dann für die Linie

service.getJdbcTemplate().query("...."); 

Sie müssen den Dienst, dann die service.getJdbcTemplate verspotten () Methode, um ein JdbcTemplate-Scheinobjekt zurückzugeben und dann die Abfragemethode von JdbcTemplate zu verspotten, um die von Ihnen benötigte Liste zurückzugeben. Etwas wie dieses:

@Mock 
Service service; 

@Mock 
JdbcTemplate jdbcTemplate; 


@Test 
public void testGetUserNames() { 

    List<String> userNames = new ArrayList<String>(); 
    userNames.add("bob"); 

    when(service.getJdbcTemplate()).thenReturn(jdbcTemplate); 
    when(jdbcTemplate.query(anyString(), anyObject()).thenReturn(userNames); 

    String retVal = Class.getUserNames("test"); 
    assertEquals("bob", retVal); 
} 

Das oben genannte erfordert keine Art Frühlingsunterstützung. Wenn Sie einen Integrationstest durchführen, bei dem Sie tatsächlich testen möchten, ob Daten ordnungsgemäß aus einer Datenbank abgerufen werden, sollten Sie wahrscheinlich den Spring Test Runner verwenden.

+0

Vielen Dank wxkevin :) – Mat

+0

Ich bin die folgende Ausnahme erhalten. Ich bin dem gleich gefolgt. http://stackoverflow.com/questions/38374823/spring-jdbctemplate-junit – Javadroider

1

Sie müssen dazu den Federtest verwenden. Werfen Sie einen Blick eine in der Dokumentation:

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html

Sie benötigen einen Test mit @RunWith erstellen und verwenden, um Ihre Feder conf mit @ContextConfiguration:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:spring-config.xml") 
public class SpringAppTests { 
    @Autowired 
    private HelloService helloService; 

    @Test 
    public void testSayHello() { 
     Assert.assertEquals("Hello world!", helloService.sayHello()); 
    } 
} 

Sie erhalten hier eine kleine Erklärung aus der Dokumentation :

@Runwith

@Runwith (SpringJUnit4ClassRunner.class), Entwickler Standard JUnit 4.4 Modul- und Integrationstests implementieren kann und gleichzeitig die Vorteile des Testcontext-Rahmen, wie die Unterstützung für das Laden Anwendungskontexte, Dependency Injection von Testinstanzen, Transaktionstestmethode ernten Ausführungs usw.

@ContextConfiguration

@ContextConfiguration Definiert Klassenebene Metadaten, die zu 012 verwendet wirdBestimmen, wie ein ApplicationContext für Integrationstests geladen und konfiguriert wird. Konkret deklariert @ContextConfiguration entweder die Ressourcen des Anwendungskontext-Ressourcenbereichs oder die mit Anmerkungen versehenen Klassen , die zum Laden des Kontexts verwendet werden. Hoffe

Hoffnung zu helfen

+0

Danke Fede .. Ich denke, ich muss etwas präziser über das sein, was ich erreichen möchte ... Ich möchte wissen, ob es möglich ist, die Rückkehr der jdbcTemplate.query-Methode mit JUnit und Mockito Mockito ... Vielen Dank – Mat

+0

@Mat Entschuldigung Missverständnis brauchen Sie. Wenn Sie möchten, kann ich die Antwort löschen. Btw, in diesem Fall brauchen Sie Mockito, können Sie einen Blick auf diese Seite werfen http://gojko.net/2009/10/23/mockito-in-six-easy-examples/ –