直接用代码说话吧:@Component
public class AService {
@Transactional
public void addA(A a) { //将一个对象a写入表A
...
}
}@Component
public class BService {
@Transactional
public void addB(B b) { //将一个对象b写入表B
...
throw new RunntimeException();
}
}public class SomeService {
@Autowired;
private AService aService; @Autowired;
pricate BService bService;
@Transactional
public void addSome() {
...
aService.addA(a);
bService.addB(b);
}
}比如上面的例子,在实际运行中调用addSome的时候,由于addB会抛出异常,所以addA插入的对象回滚,数据表A是没数据的,这一点已经用肉眼在数据库种证实了。现在我想写个自动的测试:
public class SomeServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
@Test(expected = RunntimeException.class)
try {
someService.addSome();
} finally {
//检查是否已经插入a
Assert.assertNull(aService.selectA(a));
}
}
获得如下错误:
java.lang.Exception: Unexpected exception, expected<RuntimeException> but was<junit.framework.AssertionFailedError>就是说已经插入,就算错误去到finally也没回滚,a还在数据库,应该如何做这类测试呢?
public class AService {
@Transactional
public void addA(A a) { //将一个对象a写入表A
...
}
}@Component
public class BService {
@Transactional
public void addB(B b) { //将一个对象b写入表B
...
throw new RunntimeException();
}
}public class SomeService {
@Autowired;
private AService aService; @Autowired;
pricate BService bService;
@Transactional
public void addSome() {
...
aService.addA(a);
bService.addB(b);
}
}比如上面的例子,在实际运行中调用addSome的时候,由于addB会抛出异常,所以addA插入的对象回滚,数据表A是没数据的,这一点已经用肉眼在数据库种证实了。现在我想写个自动的测试:
public class SomeServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
@Test(expected = RunntimeException.class)
try {
someService.addSome();
} finally {
//检查是否已经插入a
Assert.assertNull(aService.selectA(a));
}
}
获得如下错误:
java.lang.Exception: Unexpected exception, expected<RuntimeException> but was<junit.framework.AssertionFailedError>就是说已经插入,就算错误去到finally也没回滚,a还在数据库,应该如何做这类测试呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货