web-dev-qa-db-fra.com

Spring jdbcTemplate test unitaire

Je suis nouveau au printemps et seulement un peu expérimenté avec JUnit et Mockito

J'ai la méthode suivante qui nécessite un test unitaire

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)

Quelqu'un a-t-il des suggestions sur la manière dont je pourrais atteindre cet objectif avec JUnit et Mockito? 

Merci beaucoup d'avance! 

6
Mat

Si vous voulez faire un test unitaire pur, alors pour la ligne

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

Vous devrez simuler le service, puis la méthode service.getJdbcTemplate () pour renvoyer un objet simulé JdbcTemplate, puis simuler la méthode de requête de JdbcTemplate simulé pour renvoyer la liste dont vous avez besoin. Quelque chose comme ça:

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

Ce qui précède ne nécessite aucune sorte de support Spring. Si vous réalisiez un test d'intégration dans le cadre duquel vous vouliez réellement tester que les données étaient extraites d'une base de données correctement, vous voudriez probablement utiliser Spring Test Runner.

10
wxkevin

Pour ce faire, vous devez utiliser Spring Test. Jetez un coup d'oeil à la documentation:

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

Vous devez créer un test avec @RunWith et utiliser votre conférence print avec @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());
    }
}

Ici vous avez une petite explication de la documentation:

@Runwith

@Runwith (SpringJUnit4ClassRunner.class), les développeurs peuvent implémenter Des tests standard d’unité et d’intégration JUnit 4.4 et simultanément profiter des avantages du framework TestContext, tels que la prise en charge du chargement des contextes d’application , injection de dépendance d'instances de test, exécution de la méthode de test transactionnelle, etc.

@ContextConfiguration

@ContextConfiguration Définit les métadonnées de niveau classe utilisées pour Déterminer comment charger et configurer un ApplicationContext pour les tests d'intégration . Plus précisément, @ContextConfiguration déclare soit Les emplacements des ressources du contexte de l'application, soit les classes annotées Qui seront utilisées pour charger le contexte. J'espère aider

J'espère aider

1
Federico Piazza