Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧测试:可计数的坏结果_Java_Spring_Hibernate_Spring Test - Fatal编程技术网

Java 弹簧测试:可计数的坏结果

Java 弹簧测试:可计数的坏结果,java,spring,hibernate,spring-test,Java,Spring,Hibernate,Spring Test,我使用导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable对Hibernate与HSQL数据库的连接进行了以下测试: 对表中的行进行计数,但删除一行后,结果仍然相同。我的代码有什么问题 更新:jdbcTemplate和HibernateSessionFactory使用相同的数据源bean。 package com.habuma.spitter.persistence; import static org.j

我使用导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable对Hibernate与HSQL数据库的连接进行了以下测试:
对表中的行进行计数,但删除一行后,结果仍然相同。我的代码有什么问题

更新:
jdbcTemplate
和Hibernate
SessionFactory
使用相同的数据源bean。

package com.habuma.spitter.persistence;

import static org.junit.Assert.assertEquals;
import static org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;

import com.habuma.spitter.domain.Spitter;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:persistence-context.xml",
                "classpath:test-dataSource-context.xml",
                "classpath:test-transaction-context.xml"})
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=true)
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
@Transactional
public class DataAccessUnitTestTemplate {

    @Autowired
    private ApplicationContext context;

    @Autowired
    private SpitterDao spitterDao;

    @Autowired
    private SimpleJdbcTemplate jdbcTemplate;

    @Test
    public void testDataAccess() {

        Spitter spitter = new Spitter();
        spitter.setFullName("First");
        spitter.setEmail("one@gmail.com");
        spitter.setUsername("onefirst");
        spitter.setPassword("password");
        spitter.setUpdateByEmail(false);

        //add to database
        spitterDao.addSpitter(spitter);

        //update user with id = 3
        Spitter toChangeSpitter = spitterDao.getSpitterById(3);
        toChangeSpitter.setFullName("NULL");
        spitterDao.saveSpitter(toChangeSpitter);

        //add next user
        spitter = new Spitter();
        spitter.setFullName("Second");
        spitter.setEmail("two@gmail.com");
        spitter.setUsername("twosecond");
        spitter.setPassword("pass");
        spitter.setUpdateByEmail(false);
        spitterDao.addSpitter(spitter);

        assertEquals(4, countRowsInTable(jdbcTemplate, "spitter"));

        for(int i = 1; i <= 4; i++) {
            spitter = spitterDao.getSpitterById((long)i);
            System.out.println(spitter.getId() + " : " + spitter.getUsername() + " : " + spitter.getFullName());
        }

        //delete user with ID = 4
        spitterDao.deleteSpitter(4);

        System.out.println("\n");
        for(int i = 1; i <= 3; i++) {
            spitter = spitterDao.getSpitterById((long)i);
            System.out.println(spitter.getId() + " : " + spitter.getUsername() + " : " + spitter.getFullName());
        }
        System.out.println("Ehm ... " + spitterDao.getSpitterById(4));  //null
        assertEquals(3, countRowsInTable(jdbcTemplate, "spitter")); //assertion ? rows still 4
    }

}
package com.habuma.spitter.persistence;
导入静态org.junit.Assert.assertEquals;
导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.ApplicationContext;
导入org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.TestExecutionListeners;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
导入org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
导入org.springframework.test.context.transaction.TransactionConfiguration;
导入org.springframework.test.context.transaction.TransactionalTestExecutionListener;
导入org.springframework.transaction.annotation.Transactional;
导入com.habuma.spitter.domain.spitter;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“classpath:persistence context.xml”,
“classpath:test dataSource context.xml”,
“classpath:test transaction context.xml”})
@TransactionConfiguration(transactionManager=“txMgr”,defaultRollback=true)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,TransactionalTestExecutionListener.class})
@交易的
公共类DataAccessUnitTestTemplate{
@自动连线
私有应用程序上下文上下文;
@自动连线
私人斯皮特道斯皮特道;
@自动连线
私有SimpleJdbcTemplate jdbcTemplate;
@试验
public void testDataAccess(){
吐痰器=新吐痰器();
spitter.setFullName(“第一”);
spitter.setEmail(“one@gmail.com");
设置用户名(“onefirst”);
设置密码(“密码”);
spitter.setUpdateByEmail(假);
//添加到数据库
斯皮特道。阿德斯皮特(斯皮特);
//使用id=3更新用户
Spitter-toChangeSpitter=spitterDao.getSpitterById(3);
toChangeSpitter.setFullName(“NULL”);
储蓄储蓄者(toChangeSpitter);
//添加下一个用户
spitter=新的spitter();
spitter.setFullName(“第二”);
spitter.setEmail(“two@gmail.com");
设置用户名(“两秒钟”);
设置密码(“通过”);
spitter.setUpdateByEmail(假);
斯皮特道。阿德斯皮特(斯皮特);
assertEquals(4,countRowsInTable(jdbcTemplate,“spitter”);

对于(int i=1;i!Assertion!为了确保获得预期的结果,您需要在每次断言之前刷新Hibernate会话。否则,某些内容可能会缓存在会话中,而不会在数据库上执行。这种方式调用Hibernate函数将返回正确的结果,因为它会知道缓存,但会绕过它,directly通过JDBC,将看不到缓存和返回strage内容。

您的整个测试方法似乎正在同一事务中运行。如果您使用hibernate而不是JDBC进行计数,我打赌您将得到预期的答案。参考手册在测试一章的注释中也提示了此行为。
1 : habuma : Craig Walls
2 : artnames : Art Names
3 : onefirst : NULL
4 : twosecond : Second


1 : habuma : Craig Walls
2 : artnames : Art Names
3 : onefirst : NULL
Ehm ... null
>>!Assertion!<<
java.lang.AssertionError: expected:<3> but was:<4>