Статьи

Тестирование Spring 3 с помощью JUnit 4 — ContextConfiguration и AbstractTransactionalJUnit4SpringContextTests

Посмотрев в Интернете способ тестирования моего приложения Spring 3, я нашел много статей, в которых описывается, как протестировать ваше приложение с помощью JUnit. Большинство из них являются неполными примерами, которые на самом деле не работают.

В этой статье я постараюсь заполнить этот пробел и написать краткую, но простую статью о том, как протестировать приложение Spring 3 с Junit 4. То есть, чтобы было легче читать и проходить, я не буду использовать свое приложение, которое сейчас довольно большое. , но я буду использовать образец, полученный от вирусальпателя . Ссылка для скачивания проекта есть по этой ссылке.

Загрузите это приложение и импортируйте его в затмение.

Выполните следующее в вашей базе данных:

01
02
03
04
05
06
07
08
09
10
11
create database contact;
use contact;
CREATE TABLE CONTACTS
(
    id              INT PRIMARY KEY AUTO_INCREMENT,
    firstname    VARCHAR(30),
    lastname    VARCHAR(30),
    telephone   VARCHAR(15),
    email         VARCHAR(30),
    created     TIMESTAMP DEFAULT NOW()
);

Внутри вашего pom.xml добавьте следующие зависимости:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<dependency>
 <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-jpa</artifactId>
 <version>1.0.1.RELEASE</version>
</dependency>
<dependency>
 <groupId>org.junit</groupId>
 <artifactId>com.springsource.org.junit</artifactId>
 <version>4.7.0</version>
 <scope>test</scope>
</dependency>
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>org.springframework.test</artifactId>
 <version>${org.springframework.version}</version>
 <scope>test</scope>
</dependency>
<dependency> <groupId>javax.transaction</groupId>
 <artifactId>com.springsource.javax.transaction</artifactId>
 <version>1.1.0</version>
</dependency>

Также добавьте следующее для репозиториев:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<repositories>
 <repository>
  <id>com.springsource.repository.bundles.release</id>
  <name>SpringSource Enterprise Bundle Repository - SpringSource Releases</name>
 </repository>
 <repository>
  <id>com.springsource.repository.bundles.external</id>
  <name>SpringSource Enterprise Bundle Repository - External Releases</name>
 </repository>
 <repository>
  <id>com.springsource.repository.bundles.milestone</id>
  <name>SpringSource Enterprise Bundle Repository - SpringSource Milestones</name>
 </repository>
 <repository>
  <id>com.springsource.repository.bundles.snapshot</id>
  <name>SpringSource Enterprise Bundle Repository - Snapshot Releases</name>
 </repository>
 <repository>
  <id>repository.springframework.maven.release</id>
  <name>Spring Framework Maven Release Repository</name>
 </repository>
 <repository>
  <id>repository.springframework.maven.milestone</id>
  <name>Spring Framework Maven Milestone Repository</name>
 </repository>
 <repository>
  <id>repository.springframework.maven.snapshot</id>
  <name>Spring Framework Maven Snapshot Repository</name>
 </repository>
 <repository>
  <id>jboss</id>
  <name>JBoss repository</name>
 </repository>
</repositories>

В каталоге src / test / java создайте следующий пакет:
net.viralpatel.contact.form

Внутри пакета, который вы только что создали, создайте класс с именем:
AbstractContactTests

В src / test / resources создайте следующее:
сеть / viralpatel / контакт / форма

Внутри создайте следующий файл:
AbstractContactTests-context.xml

Внимание! Убедитесь, что каталоги, пакеты, классы и XML-файлы созданы именно там, где указано выше. Вы увидите, что xml-файл принимает имя тестового класса плюс «-context.xml» и что он создается в той же структуре каталогов. Это важно, потому что Spring автоматически ищет xml-файл с указанным именем и в том же каталоге.

Теперь вставьте следующее содержимое в класс AbstractContactTests:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package net.viralpatel.contact.form;
 
import net.viralpatel.contact.dao.ContactDAO;
import net.viralpatel.contact.service.ContactService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
 
@ContextConfiguration
public class AbstractContactTests extends AbstractTransactionalJUnit4SpringContextTests {
 @Autowired
 protected ContactDAO contact;
 @Autowired
 protected ContactService contactService;
 @Test
 public void sampleTest(){
   System.out.println("Number of rows is: " + contactService.listContact().size());
  System.out.println("Creating a new contact");
  Contact cont = new Contact();
  cont.setEmail("[email protected]");
  cont.setLastname("ntantis");
  cont.setFirstname("ioannis");
  cont.setTelephone("00306985587996");
  System.out.println("Before saving contact");
  contactService.addContact(cont);
  System.out.println("After saving contact. Id if contact is: " + cont.getId());
  System.out.println("Number of rows now is: " + contactService.listContact().size());
 }
}

Аннотация @ContextConfiguration сообщает Spring, как загружать и настраивать контекст приложения. Мы могли бы также сказать Spring, где он явно найдет файл, например:

@ContextConfiguration (location = {«example / test-context.xml»}, loader = CustomContextLoader.class)

Не предоставляя параметров, Spring будет искать xml-файл в том же каталоге, что и пакет класса, и файл с именем class.name-context.xml (помните подсказку выше).

Обратите внимание, что наш класс расширяет AbstractTransactionalJUnit4SpringContextTests из org.springframework.test.context.junit4. Расширяя этот класс, мы предоставляем нашим методам поддержку транзакций на уровне класса. Если мы этого не сделали и нам нужна была поддержка транзакций, нам бы пришлось либо аннотировать наши методы с помощью @Transactional, либо настраивать наш менеджер транзакций с помощью аннотации @TransactionConfiguration .

Внутри AbstractContactTests-context.xml поместите следующее содержимое:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
  xsi:schemaLocation="
 <context:property-placeholder location="classpath:jdbc.properties"/>
 <context:annotation-config/>
 <tx:annotation-driven/>
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
   p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/contact"
   p:username="root" p:password="123456"/>
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation">
   <value>classpath:hibernate.cfg.xml</value>
  </property>
  <property name="configurationClass">
   <value>org.hibernate.cfg.AnnotationConfiguration</value>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">${jdbc.dialect}</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
 <bean id="contactDAO" class="net.viralpatel.contact.dao.ContactDAOImpl"></bean>
 <bean id="contactService" class="net.viralpatel.contact.service.ContactServiceImpl"></bean>
</beans>

Здесь вы увидите много определений, которые определены в spring-servlet.xml. В моем примере они совпадают с spring-servlet.xml, но вы можете свободно изменять их. Благодаря этому Spring дает возможность создать другой источник данных, например, для процесса тестирования, или даже другой источник данных для каждого класса тестирования.

Теперь выполните класс AbstractContactTests как тест junit. Вы должны сделать следующий вывод:

Hibernate: select contact0_.ID as ID0_, contact0_.EMAIL as EMAIL0_, contact0_.FIRSTNAME as FIRSTNAME0_, contact0_.LASTNAME as LASTNAME0_, contact0_.TELEPHONE as TELEPHONE0_ from CONTACTS contact0_ Number of rows is: 0 Creating a new contact Before saving contact Hibernate: insert into CONTACTS (EMAIL, FIRSTNAME, LASTNAME, TELEPHONE) values (?, ?, ?, ?) After saving contact. Id if contact is: 2 Hibernate: select contact0_.ID as ID0_, contact0_.EMAIL as EMAIL0_, contact0_.FIRSTNAME as FIRSTNAME0_, contact0_.LASTNAME as LASTNAME0_, contact0_.TELEPHONE as TELEPHONE0_ from CONTACTS contact0_ Number of rows now is: 1 

Это все, что вам нужно, ребята. Приятного кодирования и не забудьте поделиться!

Ссылка: Spring 3 Тестирование с JUnit 4. Использование @ContextConfiguration и AbstractTransactionalJUnit4SpringContextTests от нашего партнера по JCG Иоанниса Нтантиса в блоге Giannisapi .

Статьи по Теме :