2016-12-07 5 views
7

Я пытаюсь проверить правильную информацию, полученную из БД, используя службы и правильную логику методов. В этом простом примере я использую только оператор assertEquals для сравнения идентификатора, указанного для roleService, но я все еще получаю ошибки. У меня есть следующий код:Как получить подключение к базе данных весной с помощью JUnit?

[ОБНОВЛЕНО]

Метод испытания:

@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 класс службы, обратитесь к информации базы данных, используя objectifyService из 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> 

в com.project.surveyengine.config У меня есть 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

Мое личное мнение таково, что прежде всего, вам нужно решить, какой тест вы хотите. Это действительно своего рода тест интеграции? Имеет ли смысл подключаться к реальной БД и иметь все связанные шаблоны, чтобы вы могли проверить сложную логику в своем модуле? Или это просто _unit test_, чтобы убедиться, что ваша служба ведет себя так, как ожидалось? Случай, в котором вы можете просто издеваться над зависимостями службы (mockito, easy mock и т. Д.) И просто создавать экземпляр и проверять вывод своих методов. Я не могу сказать из вашего описания, но мне кажется, что последнее, следовательно, мое предложение. – Morfic

+0

Да, ранее я использовал Mockito, но у меня есть некоторые методы, которые мне нужно издеваться над несколькими репозиториями, поэтому это становится сложной задачей. Идея проверяет ожидаемый результат от сложного модуля, но также комбинируется с использованием реальной информации из БД. Вот почему я использую услуги в тесте. –

+0

Исключение действительно просто - ваш тест не может найти бит 'defaultServletHandlerMapping'. Это происходит из-за класса WebConfig, поэтому вы должны добавить его в фильтрацию: 'Filter (type = FilterType.ANNOTATION, value = Configuration.class), Filter (type = FilterType.ANNOTATION, value = WebConfig.class)}) ' – Enigo

ответ

3

Вы пытаетесь добавить @WebAppConfiguration, как предложено в документации http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html?

Я wirte тестовый код таким образом

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

} 

, как вы можете видеть, я добавил аннотацию @WebAppConfiguration слишком

Я надеюсь, что это может помочь вам

+0

Я получаю эту ошибку: java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig –

+0

Это связано с тем, что у вас нет какой-либо lib под вашим classpath; yuo использует maven? вы можете добавить зависимость API сервлета к pom.xml –

+0

Да, я использую maven. А также я добавил зависимость servlet-api, поэтому ошибка такая же. –

Смежные вопросы