2014-06-23 22 views
7

Sono nuovo al framework Spring. Devo scrivere Unit Test per il repository JPA. Sto provando il semplice metodo repository saveAndFlush(). Ma nulla salva nel mio repository. Qui è il mio codice sorgente:Deposito unità di prova JPA

TestContext.class

@Configuration 
@PropertySource("classpath:log4j.properties") 
public class TestContext { 

    @Bean 
    public RoleService roleService() { 
     return Mockito.mock(RoleService.class); 
    } 

    @Bean 
    public RightService RightService() { 
     return Mockito.mock(RightService.class); 
    } 

    @Bean 
    public RoleRepository RoleRepository() { 
     return Mockito.mock(RoleRepository.class); 
    } 
} 

RoleServiceTest.class

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {TestContext.class}) 
@WebAppConfiguration 
public class RoleServiceTest { 

    @Autowired 
    private RoleRepository roleRepository; 

    @Test 
    public void TestServices() throws Exception { 
     RoleDetails first = new RoleDetails(); 
     first.setId("1"); 
     first.setDescription("First Description"); 
     first.setName("First"); 
     roleRepository.saveAndFlush(new RoleEntity(first)); 
     roleRepository.save(new RoleEntity(first)); 
     List<RoleEntity> roles = new ArrayList<RoleEntity>(); 
     roles = roleRepository.findAll(); 
     System.out.println(roles); 
     assertEquals(1, roles.size()); 
    } 
} 

E errore:

java.lang.AssertionError: expected:<1> but was:<0> 

Sono quasi sicuro che il problema si verifica a causa di testContext.Class. Ho usato questa classe per testare il mio controller e ha funzionato bene, ma ora ho bisogno di testare il mio database e non so come modificare contextConfiguration. Spero che somone mi aiuti. Grazie in anticipo!

risposta

7

Il problema proviene dal TestContext. Cerchi di salvare il tuo oggetto usando un oggetto fittizio, che non è corretto.

La soluzione è utilizzare il repository reale. Per questo, è necessario seguire i passi successivi:

  1. Annotate il vostro RoleRepository con la @Repository annotazione e estendere la classe con JpaRepository (RoleEntity, ID) (dove ID è il tipo che si dichiarato l'id del RoleEntity).
  2. Aggiungere il RoleRepository alla classe Context Configuration (quella reale, non una di prova). È possibile farlo aggiungendo @EnableJpaRepositories (value = "your.repository.package").
  3. Sostituisci TestContext.class dall'annotazione @ContextConfiguration nella classe RoleServiceTest con la classe di configurazione Context reale utilizzata per configurare il progetto Spring.

Spero che la mia risposta aiuti, se hai ancora bisogno di aiuto non esitare a chiedere di nuovo!

5

Il repository è un oggetto fittizio. Un oggetto fittizio, per definizione, è un oggetto che non fa ciò che dovrebbe normalmente fare, ma fa ciò che gli dici di fare nel test.

Per testare il repository, il repository deve essere reale. La classe di contesto dovrebbe quindi preferibilmente avere

@Bean 
public RoleRepository RoleRepository() { 
    return new RoleRepositoryImpl(); // or whatever the class implementing the repository is 
} 
+1

Questo è tecnicamente corretta, ma un sacco di primavera i repository di dati utilizzano la logica di auto-implementazione per le operazioni CRUD di base. Il tentativo di istanziarli direttamente non funzionerà; dovresti mostrare come ottenerli con '@ Autowired' o' @ Resource'. –

0

Se si utilizza Primavera di avvio, la creazione di una web app e si sta eseguendo fuori di un metodo main() all'interno di un Application.class si potrebbe usare:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
public class MyUnitTest { 

    Some someInstance = new Some(); 

    @Autowired 
    private SomeRepository someRepository; 
} 

@Test 
public void testSomeClass() throws Exception { 
    Some savedSome = someRepository.save(someInstance); 
    assertEquals(1, someRepository.count()); 
} 
+1

Quindi sarebbe essenzialmente un test di integrazione invece di unità, giusto? mockito runner per unit test, springjunit runner per l'integrazione – wired00

Problemi correlati