2016-12-07 1 views
7

J'essaie de tester les informations correctes fournies par DB en utilisant les services et la bonne logique des méthodes. Dans cet exemple simple, j'utilise seulement l'instruction assertEquals pour comparer l'ID donné pour le roleService, mais je reçois toujours des erreurs. J'ai le code suivant:Comment obtenir la connexion à la base de données dans Spring en utilisant JUnit?

[MISE À JOUR]

Méthode d'essai:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(value = { "classpath:applicationContext.xml" }) 
@Transactional 
@WebAppConfiguration 
@ComponentScan(basePackages ={ "com.project.surveyengine" }, 
      excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Configuration.class) , 
           @ComponentScan.Filter(type = FilterType.ANNOTATION, value = WebConfig.class)}) 
public class RoleServiceTest { 

@Configuration 
    static class ContextConfiguration {  
     @Bean 
     public RoleService roleService() { 
      RoleService roleService = new RoleService(); 
      // set properties, etc. 
      return roleService; 
     } 
    } 

    private final LocalServiceTestHelper helper = 
      new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig() 
        .setDefaultHighRepJobPolicyUnappliedJobPercentage(100)); 

    private Closeable closeable; 

    @Before 
    public void setUp() { 
     helper.setUp(); 
     ObjectifyService.register(Role.class); 
     closeable = ObjectifyService.begin(); 
    } 

    @After 
    public void tearDown() { 
     closeable.close(); 
     helper.tearDown(); 
    } 

    @Autowired 
    private RoleService roleService; 

    @Test 
    public void existsRole() throws Exception{ 
     Role role = roleService.getByName("ROLE_ADMIN"); 
     assertEquals("Correct test", Long.valueOf("5067160539889664"), role.getId()); 
    } 

} 

RoleService est la classe de service qui consultent des informations de base de données à l'aide objectifyService de Google App Engine.

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:annotation-config /> 

    <context:component-scan base-package="com.project.surveyengine.config"/> 

    <!--Controllers--> 
    <bean id="inboxController" class="com.project.surveyengine.controller.InboxController" autowire="byType"></bean> 
    <bean id="mailController" class="com.project.surveyengine.controller.MailController" autowire="byType"></bean> 
    <bean id="loginController" class="com.project.surveyengine.controller.LoginController" autowire="byType"></bean> 
    <bean id="initController" class="com.project.surveyengine.controller.InitController" autowire="byType"></bean> 

    <!--Services--> 
    <bean id="answerService" class="com.project.surveyengine.service.impl.AnswerService" autowire="byType"></bean> 
    <bean id="blobService" class="com.project.surveyengine.service.impl.BlobService" autowire="byType"></bean> 
    <bean id="mailService" class="com.project.surveyengine.service.impl.MailService" autowire="byType"></bean> 
    <bean id="caseService" class="com.project.surveyengine.service.impl.CaseService" autowire="byType"></bean> 
    <bean id="roleService" class="com.project.surveyengine.service.impl.RoleService" autowire="byType"></bean> 
</beans> 

Dans le com.project.surveyengine.config je les trois classes folliwing:

1)

public class MyXmlWebApplicationContext extends XmlWebApplicationContext { 
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) { 
     super.initBeanDefinitionReader(beanDefinitionReader); 
     if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { 
      beanDefinitionReader.setValidating(false); 
      beanDefinitionReader.setNamespaceAware(true); 
     } 
    } 
} 

2)

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter{  
    @Bean 
    UrlBasedViewResolver resolver(){ 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
    resolver.setPrefix("/views/"); 
    resolver.setSuffix(".jsp"); 
    resolver.setViewClass(JstlView.class); 
    return resolver; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/statics/**").addResourceLocations("/statics/"); 
    }  
} 

3)

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityContext extends WebSecurityConfigurerAdapter {  
    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/statics/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .formLogin() 
       //...more code 
    } 
} 

I'm getting this errors:

Dec 20, 2016 4:40:03 PM com.google.appengine.api.datastore.dev.LocalDatastoreService init INFO: Local Datastore initialized: Type: High Replication Storage: In-memory

java.lang.NullPointerException at com.project.surveyengine.service.impl.RoleServiceTest.existsRole(RoleServiceTest.java:111)

RoleServiceTest.java:111 = assertEquals("Correct test", Long.valueOf("5067160539889664"), role.getId()); 
+1

Mon opinion personnelle est que Tout d'abord, vous devez décider quel type de test vous voulez. Est-ce vraiment une sorte de test d'intégration? Est-il logique de se connecter à la base de données réelle et de configurer tous les éléments standard associés afin de pouvoir vérifier une logique complexe dans votre module? Ou est-ce juste un _unit test_ pour vérifier que votre service se comporte comme prévu? Cas dans lequel vous pouvez simplement vous moquer des dépendances du service (mockito, easy mock, etc) et juste l'instancier et vérifier la sortie de ses méthodes. Je ne peux pas dire à partir de votre description, mais pour moi, il semble que ce dernier, d'où ma suggestion. – Morfic

+0

Oui, auparavant j'utilisais Mockito, mais j'ai quelques méthodes dont j'ai besoin pour se moquer de plusieurs dépôts, donc cela devient un travail complexe. L'idée est de vérifier le résultat attendu d'un module complexe, mais aussi combiné en utilisant des informations réelles de DB. C'est pourquoi j'utilise les services dans le test. –

+0

L'exception est vraiment simple: votre test ne trouve pas le bean 'defaultServletHandlerMapping'. Cela se produit en raison de la classe 'WebConfig', vous devez donc l'ajouter au filtrage:' Filter (type = FilterType.ANNOTATION, value = Configuration.class), Filter (type = FilterType.ANNOTATION, valeur = WebConfig.class)} – Enigo

Répondre

3

Avez-vous essayé d'ajouter @WebAppConfiguration comme suggéré dans la documentation http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html?

Je Wirte votre code de test de cette manière

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(value = { "classpath:applicationContext.xml" }) 
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false) 
@Transactional 
@WebAppConfiguration 
@ComponentScan(basePackages ={ "com.project.surveyengine" }, excludeFilters = { 
       @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Configuration.class) }) 
public class RoleServiceTest { 

    @Autowired 
    private RoleService roleService; 

    @Test 
    public void existsRole() throws Exception{ 
     Role role = roleService.getByName("ROLE_ADMIN"); 
     assertEquals("Correct test", Long.valueOf("5067160539889664"), role.getId()); 
    } 

} 

comme vous pouvez le voir i ajouté le @WebAppConfiguration d'annotation trop

J'espère que cela peut vous aider à

+0

Je reçois cette erreur: java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig –

+0

Ceci est lié au fait que vous n'avez pas de lib sous votre classpath; êtes-vous en utilisant maven? vous pouvez ajouter la dépendance de l'API servlet au pom.xml –

+0

Oui, j'utilise maven. Et aussi j'ai ajouté la dépendance servlet-api, donc l'erreur est la même. –