java 如何创建org.springframework.dao.数据访问异常的示例?

iyfjxgzm  于 2023-03-16  发布在  Java
关注(0)|答案(5)|浏览(170)

我需要创建用于处理DataAccessException的JUnit测试,
但当我尝试的时候

throw new DataAccessException();

接收:

Cannot instantiate the type DataAccessException

为什么?我能做什么?谢谢。

fdbelqdn

fdbelqdn1#

  • DataAccessException* 是一个抽象类,无法示例化。请改用一个具体类,如 new DataRetreivalFailureException(“这就是原因”) 或创建您自己的:
throw new DataAccessException("this was the reason") {};

并且您会得到一个从DataAccessException派生的匿名类。

1yjd4xko

1yjd4xko2#

为什么?
因为DataAccessException就是abstract class,所以不能示例化抽象类。
我能怎么办?
如果选中层次结构:

extended by java.lang.RuntimeException
              extended by org.springframework.core.NestedRuntimeException
                  extended by org.springframework.dao.DataAccessException

因为NestedRuntimeException也是抽象的,所以可以抛出一个new RuntimeException(msg);(不推荐),也可以按照另一个答案的建议--使用一个具体的类。

6za6bjd0

6za6bjd03#

除了使用TransientDataAccessException.class之外,还可以使用

doThrow(new TransientDataAccessException("Oops! Something went wrong.") {}).when(myMock).callSomeMethod(param1,param2);
92dk7w1h

92dk7w1h4#

如果您查看源代码,您会注意到它是一个抽象类,请仔细查看:

package org.springframework.dao;

import org.springframework.core.NestedRuntimeException;

public abstract class DataAccessException extends NestedRuntimeException {
    public DataAccessException(String msg) {
        super(msg);
    }

    public DataAccessException(String msg, Throwable cause) {
        super(msg, cause);
    }
}

你知道抽象类是不能扩展的...
但是你可以用其他的方式来使用它,这是一种使用它的方式,例如:

public interface ApiService {
    Whatever getSomething(Map<String, String> Maps) throws DataAccessException;
}
fruv7luv

fruv7luv5#

在我的测试模拟中,我需要返回一个带有DataAccessException的Mono.error。我示例化了抽象类的一个匿名类,它对我很有效:

Mono.error(new DataAccessException("exception message"){})

相关问题