Я пытаюсь реализовать тест для проекта Spring MVC (v3.12), используя библиотеку Mokito. Но у меня есть ограничение в том, что мне нужно, чтобы использовать Java 1.7. и SpringMVC 3.x. Поэтому, когда я пытаюсь использовать @RunWith(SpringRunner.class)
или @RunWith(SpringJUnit4ClassRunner.class)
, я получаю ошибку UnsupportedClassVersionError
.
В другом случае (когда я удаляю строку с аннотацией @RunWith
), я получаю нулевой объект userService
определения, когда я определяю его с помощью @Autowired
или другой аннотации.
Лучше, если я покажу часть теста (я использую учебник ):
@RunWith(SpringRunner.class) //1
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class QuadraticEquationServiceTest3 {
@InjectMocks
private UserService userService;
@Mock
private UserRepository userRepository;
@Test
public void loadTest(){
User user = new User();
user.setId(1);
user.setName("java");
when(userRepository.getUserById(1)).thenReturn(user);
User testUser = userService.getUserById(1); //2
//....
}
}
В этом случае я получаю сообщение об ошибке:
java.lang.UnsupportedClassVersionError: org/springframework/test/context/junit4/SpringRunner : Unsupported major.minor version 52.0
Необходимо отметить: когда я проверяю 8 версию JDK в IDE, я получаю следующее исключение:
java.lang.IllegalStateException: не удалось загрузить TestContextBootstrapper [null]. Укажите @ BootstrapWith атрибут 'value' или сделайте класс загрузчика по умолчанию доступным.
Когда я удаляю @RunWith...
, я получаю NullPointerException
в строке 2
(userService
объект).
Когда я создаю userService
с помощью new UserService()
, я получаю nullPointerException
в UserService
классе, когда проект пытается вызвать userRepository
объект.
Вопрос:
Почему я не могу вызвать сервисный объект, используя @Autowired
?
Как реализовать макет репозитория в сервисном слое тестирования в Spring MVC + Java 1.7?
дополнительная информация:
Услуги:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User getUserById(long id) {
return userRepository.getUserbiId(id);
}
}
Repository:
@Repository
public class QuadraticEquationRepository implements QuadraticDAORepository {
@Autowired
private SessionFactory sessionFactory;
@Override
public User getUserById(long id) {
User u;
Session session;
session = sessionFactory.getCurrentSession();
try {
u = (User) session.load(User.class, id);
} catch (ObjectNotFoundException e ){
return null;
}
return u;
}
}
pom.xml (часть с Spring и тестовыми зависимостями):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.exercise</groupId>
<artifactId>quadraticEquation</artifactId>
<name>quadraticEquation</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<spring-version>3.2.9.RELEASE</spring-version>
<hibernate-version>4.2.7.Final</hibernate-version>
<mysql-version>5.1.27</mysql-version>
<apache-connection-pooling-version>1.4</apache-connection-pooling-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>java-hamcrest</artifactId>
<version>2.0.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.1.3.RELEASE</version>
<scope>test</scope>
</dependency>
корень-context.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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" 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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="quadratic" />
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- <property name="ignoreUnresolvablePlaceholders" value="true" /> -->
<property name="locations">
<list>
<value>classpath:database.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>quadratic.model.domain</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>