В этой статье я постараюсь заполнить этот пробел и написать краткую, но простую статью о том, как протестировать приложение 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.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" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd < 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 .