Как протестировать сервисный слой, используя @Autowired на языке SpringMVC и языке уровня Java.Неподдерживаемая проблема ClassVersionError - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь реализовать тест для проекта 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...