Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
Spring@Transactional_Spring_Junit_Transactions - Fatal编程技术网

Spring@Transactional

Spring@Transactional,spring,junit,transactions,Spring,Junit,Transactions,我试图为一个使用Spring@Transactional注释的系统构建一个简单的JUnit测试,但没有太大成功 我正在为具有唯一约束的列创建两个具有相同值的实例。如果两个实例创建恰好在不同的事务中,我希望第一个实例将提交,第二个实例将抛出一个异常,导致一行——我看到了这种情况。如果两个插入发生在同一个事务中,我希望它们都作为一个原子单元回滚,但我没有看到。我肯定在某个地方存在配置问题,但我没有太多的运气发现它 对于测试,我有一个bean(ContextTestHelperImpl/Context

我试图为一个使用Spring@Transactional注释的系统构建一个简单的JUnit测试,但没有太大成功

我正在为具有唯一约束的列创建两个具有相同值的实例。如果两个实例创建恰好在不同的事务中,我希望第一个实例将提交,第二个实例将抛出一个异常,导致一行——我看到了这种情况。如果两个插入发生在同一个事务中,我希望它们都作为一个原子单元回滚,但我没有看到。我肯定在某个地方存在配置问题,但我没有太多的运气发现它

对于测试,我有一个bean(ContextTestHelperImpl/ContextTestHelper),其中包含创建一个或两个实例的方法。每个都有一个传播。需要在方法上添加新注释:

@覆盖
@事务性(只读=false,传播=propagation.REQUIRES\u NEW,
rollbackFor={ContextReplicationException.class})
public Foo createOneFoo(int val)抛出ContextReplicationException{
试一试{
返回fooDAO.createFoo(val);
}捕获(可丢弃){
抛出新的ContextReplicationException(th);
}
}
@凌驾
@事务性(只读=false,传播=propagation.REQUIRES\u NEW,
rollbackFor={ContextReplicationException.class})
public Foo[]createTwoFoos(int val)抛出ContextReplicationException{
试一试{
返回新的Foo[]{fooDAO.createFoo(val),fooDAO.createFoo(val)};
}捕获(可丢弃){
抛出新的ContextReplicationException(th);
}
}
我有一个JUnit测试(ContextTest),它调用第一个方法两次:

public void dupTestTwoTransactions(){
contextTestHelper.deleteAllFoo();
Assert.assertEquals(0,contextTestHelper.getCountOfFoo());
布尔hadException=false;
试一试{
contextTestHelper.createOneFoo(重复的_值);
}捕获(ContextReplicationException th){
hadException=true;
System.out.println(“[ContextTest][dupTestTwoTransactions]意外错误:“%th”);
th.printStackTrace();
}
Assert.assertEquals(hadeexception,false);
Assert.assertEquals(1,contextTestHelper.getCountOfFoo());
试一试{
contextTestHelper.createOneFoo(重复的_值);
}捕获(ContextReplicationException th){
hadException=true;
}
Assert.assertEquals(hadeexception,true);
Assert.assertEquals(1,contextTestHelper.getCountOfFoo());
}
这正如预期的那样有效。第一个调用不会引发异常;第二个电话是。最后,Foo表中有一行

我在同一个类中有第二个JUnit测试,它调用后一个方法一次:

@测试
公共无效dupTestOneTransaction(){
contextTestHelper.deleteAllFoo();
Assert.assertEquals(0,contextTestHelper.getCountOfFoo());
布尔hadException=false;
试一试{
contextTestHelper.createTwoFoos(重复的_值);
}捕获(ContextReplicationException th){
hadException=true;
}
Assert.assertEquals(hadeexception,true);
Assert.assertEquals(0,contextTestHelper.getCountOfFoo());
}
第二个测试在最后一个断言中失败——Foo实例的计数为1,而我预期为0

我在数据源设置中有一些诡计,因为我们试图在JBoss下运行代码时使用JNDI查找。因此,JUnit需要在幕后设置JNDI查找(ContextTest.java):

@BeforeClass
公共静态void setUpClass()引发NamingException{
ApplicationContext context=new ClassPathXmlApplicationContext(“classpath:spring test.xml”);
DataSource testDataSource=(DataSource)context.getBean(“testDataSource”);
SimpleNameingContextBuilder=新SimpleNameingContextBuilder();
bind(“java:comp/env/jdbc/dataSource”,testDataSource);
builder.activate();
}
下面是我的spring-test.xml文件,它在NetBeans中是在测试包的默认包中设置的:


${db.driver.class}
${db.url}
${db.user}
${db.password}
由于第一次测试有效,我显然能够连接到数据库,因此我认为这里没有任何特殊问题

下面是applicationContext.xml:


类路径:用户特定的.properties
${db.方言}
${db.show_sql}
${db.hbm2ddl.auto}
所有不只是用于测试的类(Foo、FooDAO、FooDAOImpl)都在com.xyzy包中,所有测试类(ContextTest、ContextTestHelper、ContextTestHelperImpl、contextreplicationexception)都在com.xyzy.test包中

Foo、FooDAO或FooDAOImpl上没有@Transactional注释。ContextTestHelperImpl是唯一指定事务边界的

有没有关于如何修复此问题的建议,以使其正常运行?(我选择的dataSource类或transactionManager是否有问题?applicationContext.xml中的某些设置是否不一致或冗余?)

更新:

DAO实现类:

@Repository(“FooDAO”)
公共类FooDAOImpl实现了FooDAO{
私有HibernateTemplate HibernateTemplate;
@自动连线
public void setSessionFactory(SessionFactory SessionFactory){
this.hibernateTemplate=新的hibernateTemplate(sessionFactory);
}
@凌驾
公共Foo createFoo(int val){
Foo-Foo=新的Foo();
foo.setVal(val);
saveFoo(foo);
返回foo;
}
void saveFoo(Foo-Foo){
hibernateTemplate.save(foo);
}