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());
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
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. –
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