当前位置: 首页 > 面试题库 >

防止在使用Hibernate / Spring / Maven / MySQL运行测试后删除数据

葛宪
2023-03-14
问题内容

我正在使用Hibernate / Spring / Maven /
MySQL和JUnit进行单元测试。直到昨天,即使测试运行完成,我的测试数据仍保留在数据库中。我从今天开始进行了配置,每次测试运行后突然删除了所有数据。可以肯定的是,这不是错误,而是配置问题。然而,我迷路了。

appContext.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"
       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
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util">

      <tx:annotation-driven/>
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

    <bean class="org.springbyexample.util.log.AnnotationLoggerBeanPostProcessor" />

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:/settings.properties</value>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

       <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitName" value="RDBMS"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false"/>
                <property name="showSql" value="true"/>
                <property name="databasePlatform" value="${databasePlatformDialect}"/>
                <property name="database">
                    <util:constant static-field="${databaseVendor}" />
                </property>
            </bean>
        </property>    
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <context:component-scan base-package="de.test">
         <context:exclude-filter type="regex" expression="de\.sandbox\.test\.hibernatedao.*"/>
    </context:component-scan>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    </beans>

persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">

    <persistence-unit name="RDBMS" transaction-type="RESOURCE_LOCAL">
        <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    </persistence-unit>
</persistence>

感谢您的建议。

编辑----根据需要,测试用例:

package de.test.base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/appContextMain.xml")
@Transactional
public abstract class SpringTestCase {
}

儿童:

package de.test.dao;

import de.test.base.SpringTestCase;
import de.test.businessobjects.BodSt;
import de.test.businessobjects.Trainee;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.springbyexample.util.log.AutowiredLogger;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Collection;
import java.util.List;

public class BodStDAOTest extends SpringTestCase {

    @AutowiredLogger
    final Logger logger = null;

    @Autowired
    private IBodStDAO bodStDAO;

    @Autowired
    private ITraineeDAO traineeDAO;

    Trainee trainee = new Trainee();

    @Before
    public void onSetUpInTransaction() throws Exception {

        this.trainee.setName("Name");
        this.trainee.setSurname("Surname");
        this.trainee = this.traineeDAO.save(this.trainee);
    }

    @Test
    public void testSingleObjectSave() throws Exception {

        Collection before = (List) this.bodStDAO.getAll();

        BodSt bodSt = new BodSt();
        bodSt.setWeight((float) 2.2);
        bodSt.setHeight(new Float(0.0));
        bodSt.setTrainee(trainee);
        bodSt = this.bodStDAO.save(bodSt);

        Collection after = (List) this.bodStDAO.getAll();

        this.logger.info("BodSt size before: " + before.size() + " and after: " + after.size());
        Assert.assertEquals(before.size() + 1, after.size());
    }
}

问题答案:

在用于创建测试数据的测试用例上使用@Rollback(value = false)批注可确保不会删除该数据。



 类似资料:
  • 使用maven对Spring应用程序进行单元测试后,在完成构建时遇到问题。我注意到mvn安装没有完成,在运行了所有单元测试之后,它似乎挂起了。如果运行我将从cmd行获得要完成的测试,但构建挂起 这就是它的结尾。两个线程正在运行,不确定我在那里做了什么。无论如何,为了排除故障,我删除了所有测试并让程序完全构建。如果我运行,我就可以完成它。最后,我添加了一个JUnit测试,它本质上是一个system.

  • 我有一个文件夹结构如下 当我运行命令时。它只运行Java单元测试(位于*src\test\Java*目录下),而不调用Groovy测试用例。Groovy似乎再也找不到Groovy测试了。 请帮助我在Maven的帮助下启用groovy测试用例执行? 波姆。xml

  • 我的项目中有以下测试类 在我的项目中,我有一些方法是用注释的,这些方法在Spring启动后运行 当我运行AddressParserTest时,myMethod方法也会运行,因为EventListener(ApplicationReadyEvent.class)是否有任何方法可以阻止它在测试期间运行?

  • 问题内容: 我刚刚在Eclipse上第一次安装了插件m2e。 我编写了一个简单的JUnit(版本4)测试。我可以从Eclipse中运行它,但不能从pom.xml中运行它(alt单击,运行方式,Maven测试)。我想我需要告诉Maven搜索该课程,但我只是不知道如何。 另外,我在groupId“ junit”中找不到JUnit 4:只有版本3.8.1可用。我真的需要为3.x版本而不是4+版本编写测试

  • 问题内容: 我正在制作一个Android应用程序,该应用程序对您所能获得的积分有时间限制。但是,如果您关闭该应用程序,计时器将继续运行。应用程序暂停时如何暂停? 问题答案: 您可以用类似的方法取消它 并使用该变量保存在一个或其他持久变量中。然后再次使用该变量以启动计时器 共享偏好

  • 我有3个maven项目。项目1,项目2 为此,我在项目2 pom.xml文件中添加了这个 我的pom。Project3的xml是- 在项目3中,我添加了testng。xml文件来运行测试。现在如果我运行这个测试。xml文件,那么我所有的测试用例都成功运行了。如果我尝试使用maven测试运行测试用例,那么它会失败。 我已经在下面的pom文件中包含了testng.xml文件,以便使用maven运行te