测试事务可以回滚 但是控制台报错

测试事务可以回滚 但是控制台报错

老师,我按照视频中的步骤测试事务回滚,虽然错误数据不会添加到数据库,但是控制台报错,视频中并没有
报错,麻烦老师帮我看一下什么问题
控制台错误:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2020-05-15 21:38:13.026 [main] DEBUG com.zhou.o2o.dao.ShopDao.insertShop - ==>  Preparing: INSERT INTO tb_shop(owner_id, area_id, shop_category_id, shop_name, shop_desc, shop_addr, phone, shop_img, priority, create_time, last_edit_time, enable_status, advice) VALUES (?,?,?,?, ?,?,?,?,?, ?,?, ?,?) 
2020-05-15 21:38:13.089 [main] DEBUG com.zhou.o2o.dao.ShopDao.insertShop - ==> Parameters: 1(Long), 2(Integer), 1(Long), 测试的店铺2(String), test1(String), test1(String), test1(String), null, null, 2020-05-15 21:38:13.004(Timestamp), 2020-05-15 21:38:13.004(Timestamp), 0(Integer), 审核中(String)
2020-05-15 21:38:13.097 [main] DEBUG com.zhou.o2o.dao.ShopDao.insertShop - <==    Updates: 1

com.zhou.o2o.exceptions.ShopOperationException: addShop error:店铺创建失败

	at com.zhou.o2o.service.impl.ShopServiceImpl.addShop(ShopServiceImpl.java:64)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy23.addShop(Unknown Source)
	at com.zhou.o2o.service.ShopServiceTest.testAddShop(ShopServiceTest.java:52)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

五月 15, 2020 9:38:13 下午 org.springframework.context.support.GenericApplicationContext doClose
信息: Closing org.springframework.context.support.GenericApplicationContext@2b98378d: startup date [Fri May 15 21:38:11 CST 2020]; root of context hierarchy

Process finished with exit code -1
/**
 * 店铺操作异常类
 * 这样只是对RuntimeException很薄的封装,但看到这样的异常
 * 能够知道是和店铺相关
 */
public class ShopOperationException extends  RuntimeException{


    private static final long serialVersionUID = 8239429277078064769L;

    public ShopOperationException(String msg){
        super(msg);
    }
}
/**
 * 店铺服务层接口实现类
 */
@Service
public class ShopServiceImpl implements ShopService {
    @Autowired
    private ShopDao shopDao;


    /**
     * 店铺的注册方法
     * @param shop  店铺对象
     * @param shopImg 店铺图片
     * @return 店铺的数据传输类当前状态
     */
    @Override
    @Transactional
    public ShopExecution addShop(Shop shop, File shopImg) {
        /**
         * 店铺注册步骤:
         *  1.将店铺的信息插入到数据库中并返回店铺的id
         *  2.根据店铺的id去创建出存储图片的文件夹并处理存储的图片
         *  3.最后将图片的相对路径地址更新回数据库中
         */

        //0.对shop的空值判断
        if(shop == null){
            return  new ShopExecution(ShopSateEnum.NULL_SHOP);//shop信息为空
        }else if(shop.getShopCategory() == null){
            return  new ShopExecution(ShopSateEnum.NULL_SHOP_CATEGORY);//ShopCategory信息为空
        }else if(shop.getArea() == null){
            return new ShopExecution(ShopSateEnum.NULL_AREA);//area信息为空
        }

        try{
            // 1.将店铺的信息插入到数据库中并返回店铺的id
            shop.setEnableStatus(0);//初始化店铺状态:0 未上架
            shop.setCreateTime(new Date());//店铺创建时间
            shop.setLastEditTime(new Date());//店铺最后一次修改时间
            // 插入数据库
            int effectedNum = shopDao.insertShop(shop);
            throw new ShopOperationException("店铺创建失败");
        }catch (Exception e){
            //处理异常
            throw new ShopOperationException("addShop error:" + e.getMessage());
        }
 
    }

    //添加图片
    private void addShopImg(Shop shop, File shopImg) throws IOException {
        //获取shop图片目录的相对值路径
        String dest = PathUtil.getShopImagePath(shop.getShopId());
        //存储图片并返回相应的相对值路径
        String shopImgAddr = ImageUtil.generateThumbnail(shopImg,dest);
        //更改图片地址
        shop.setShopImg(shopImgAddr);
    }
}
public class ShopServiceTest extends BaseTest {
    @Autowired
    private  ShopService shopService;

    @Test
    public void testAddShop() {
        //准备添加店铺所需要准备的两个对象:Shop、File

        //准备Shop店铺对象
        Shop shop = new Shop();
        //准备用户对象
        PersonInfo owner = new PersonInfo();
        //准备区域对象
        Area area = new Area();
        //准备店铺分类对象
        ShopCategory shopCategory = new ShopCategory();

        //填充各个对象的数据
        owner.setUserId(1L);//设置用户id
        area.setAreaId(2);//区域id
        shopCategory.setShopCategoryId(1L);//设置分类id
        shop.setOwner(owner);
        shop.setArea(area);
        shop.setShopCategory(shopCategory);
        shop.setShopName("测试的店铺2");//店铺名称
        shop.setShopDesc("test1");//店铺描述
        shop.setShopAddr("test1");//店铺地址
        shop.setPhone("test1");//店铺联系方式
        shop.setEnableStatus(ShopSateEnum.CHECK.getState());//店铺可用状态
        shop.setAdvice("审核中");//超级管理员给店铺的提醒

        //准备 File对象
        File shopImg = new File("B:/aaa.jpg");

        //注册店铺
        ShopExecution shopExecution = shopService.addShop(shop, shopImg);
        assertEquals(ShopSateEnum.CHECK.getState(), shopExecution.getState());
    }
}

http://img1.sycdn.imooc.com//climg/5ebe9cef0998a01b19201039.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,同学的问题是测试错误的数据,可以回滚,控制台报错吗?这是正常的,视频中老师的代码也是报错,如:

http://img1.sycdn.imooc.com//climg/5ec2257209dbfe1e08580464.jpg

老师使用的eclipse,Junit测试时,报错信息出现在Junit窗口下,不是在console控制台。

祝:学习愉快~

  • jia_蛙 提问者 #1
    对,可以回滚 ,我使用的是IDEA,控制台回报错,那就没问题了,谢谢老师!
    2020-05-18 23:47:07
提问者 jia_蛙 2020-05-17 21:37:34
com.zhou.o2o.exceptions.ShopOperationException: 店铺创建失败
	at com.zhou.o2o.service.impl.ShopServiceImpl.addShop(ShopServiceImpl.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy23.addShop(Unknown Source)
	at com.zhou.o2o.service.ShopServiceTest.testAddShop(ShopServiceTest.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
五月 17, 2020 9:30:09 下午 org.springframework.context.support.GenericApplicationContext doClose
信息: Closing org.springframework.context.support.GenericApplicationContext@2b98378d: startup date [Sun May 17 21:30:08 CST 2020]; root of context hierarchy

com.zhou.o2o.exceptions.ShopOperationException: addShop error:店铺创建失败

	at com.zhou.o2o.service.impl.ShopServiceImpl.addShop(ShopServiceImpl.java:66)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy23.addShop(Unknown Source)
	at com.zhou.o2o.service.ShopServiceTest.testAddShop(ShopServiceTest.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)


提问者 jia_蛙 2020-05-17 21:35:00
我已经加了e.printStackTrace(); 这个报错消息我还是看不出什么问题来
我只能看到它说我  ShopServiceImpl.java:66, ShopServiceTest.java:59 有问题,
这两个类的代码都在上面,是没问题的呀

http://img1.sycdn.imooc.com//climg/5ec13d1c096aafde17860961.jpg

好帮手慕小班 2020-05-16 10:52:04

同学你好,由于属性等一些内容的不同,老师并不能直接测试贴出内容,但是同学可以通过如下方式来自己定位一下问题:

 根据报错信息:addShop error:店铺创建失败  在添加店铺时报出异常,同学可以在这个位置输出一下具体的报错信息,定位一下问题,看是由于什么问题导致的,比如:

http://img1.sycdn.imooc.com//climg/5ebf551609b5fce907530360.jpg

如上所示,输出e.printStackTrace();,查看具体的报错信息,是什么导致的添加店铺失败。

自己通过报错来一点点定位问题,解决问题,是以后的开发中最常见的形式。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 jia_蛙 #1
    蛮烦老师看一下
    2020-05-17 21:37:49
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师