webentwicklung-frage-antwort-db.com.de

Spring jdbcTemplate Unit-Tests

Ich bin neu im Frühling und habe nur wenig Erfahrung mit JUnit und Mockito

Ich habe die folgende Methode, 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)

Hat jemand Vorschläge, wie ich dies mit JUnit und Mockito erreichen kann? 

Vielen Dank im Voraus! 

6
Mat

Wenn Sie einen reinen Komponententest durchführen möchten, dann für die Leitung

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

Sie müssen den Service und dann die service.getJdbcTemplate () -Methode mockieren, um ein Mock-JdbcTemplate-Objekt zurückzugeben, und anschließend die Abfragemethode von Mocked JdbcTemplate, um die benötigte Liste zurückzugeben. Etwas wie das:

@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 Obige erfordert keinerlei Unterstützung für den Frühling. Wenn Sie einen Integrationstest durchführen, bei dem Sie tatsächlich testen wollten, dass Daten ordnungsgemäß aus einer Datenbank abgerufen wurden, möchten Sie wahrscheinlich den Spring Test Runner verwenden.

10
wxkevin

Sie müssen Spring Test verwenden, um dies zu tun. Schauen Sie sich die Dokumentation an:

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

Sie müssen einen Test mit @RunWith erstellen und Ihr Spring-Conf mit @ContextConfiguration verwenden:

@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());
    }
}

Hier haben Sie eine kleine Erklärung aus der Dokumentation:

@Runwith

@Runwith (SpringJUnit4ClassRunner.class) können Entwickler Standardmäßige JUnit 4.4-Einheits- und Integrationstests implementieren und gleichzeitig Die Vorteile des TestContext-Frameworks nutzen, z. B. Unterstützung für das Laden von Anwendungskontexten. Abhängigkeitsinjektion von Testinstanzen, Ausführung von Transaktionsprüfmethoden usw.

@ContextConfiguration

@ContextConfiguration Definiert Metadaten auf Klassenebene, anhand derer Bestimmt wird, wie ein ApplicationContext für Integrationstests geladen und konfiguriert wird. Insbesondere deklariert @ContextConfiguration entweder Die Speicherorte der Anwendungskontextressourcen oder die mit Anmerkungen versehenen Klassen , Die zum Laden des Kontexts verwendet werden. Hoffe zu helfen

Hoffe zu helfen

1
Federico Piazza