我正在尝试使用服务和方法的正确逻辑来测试DB提供的正确信息.在这个简单的例子中,我只使用语句assertEquals来比较为roleService提供的id,但我仍然遇到错误.我有以下代码:
[更新]
测试方法:
@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是使用Google App Engine中的objectifyService查询数据库信息的服务类.
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我有以下三个类:
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-memoryjava.lang.NullPointerException at
com.project.surveyengine.service.impl.RoleServiceTest.existsRole(RoleServiceTest.java:111)
RoleServiceTest.java:111 = assertEquals("Correct test",role.getId());
解决方法
您是否尝试按照文档
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html中的建议添加@WebAppConfiguration?
我会用这种方式来测试你的测试代码
@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",role.getId()); } }
正如你所看到的,我也添加了注释@WebAppConfiguration
我希望这可以帮到你