有没有办法捕获并抛出异常

时间:2009-11-13 16:08:44

标签: java exception-handling

我有一个转到DB的方法,因此DAO方法中的所有JDBC内容都在try / catch块中。它正在捕捉SQLException

当我针对此方法编写测试用例并且发生SqlException时,我的测试用例不会说“导致错误”。它只是快乐的方式。

但是,如果我没有在DAO方法中捕获SqlException但是将throws SqlException添加到方法中,那么我的测试用例会显示“导致错误”并向我显示发生的错误。 (这就是我想要的)。

当我尝试添加throws SqlException以及捕获SqlException的方法时,我的测试用例也没有说'导致错误'。

它的方法是什么?一个是在我的测试用例中有try / catch块但是即使我这样做,我的Junit测试用例并没有说“导致错误”,尽管异常IS发布到标准输出。

......除此之外还有什么?

我的IDE是Netbeans。这是我运行测试用例的地方。

代码:

public class MyDaoClass {
 Connection con;
 public MyDaoClass (Connection connection)
 {
  this.con = connection;
 }


 public SomeObject someMethod (String id)
 {
    try{
  Connection con = this.con;
  CallableStatement cs = con.prepareCall("{call some_sp_name (?)}");
  cs.setString (1, id);
  cs.execute()//imagine an error happens here
  ResultSet rs = cs.getResultSet()
  ...
  ....
  //return SomeObject...
    }
    catch (SqlException e) //If I remove this and add 'throws SQLException to method then everything is ok
    {
     log.error(e.getMessage());//i dont have access to log object in test case
    }

 }
    }

public class MyTestSuite extends TestCase
{
 //populate local connection
 public void testSomeMethod () throws SQLException
 {
  MyDaoClass myd = new MyDaoClass(connection);
  SomeObject s = myd.someMethod("blah");
  assertEquals (s.getFirstName(), "pepe");
 }
}

6 个答案:

答案 0 :(得分:3)

必须在方法规范中声明Java中所有已检查的异常。 SqlException是一个经过检查的异常,因此如果要抛出它,则必须将其包含在规范中。

如果要抛出异常,但无法更改方法规范,则需要使用未经检查的异常,例如RuntimeException。它还会使JUnit显示发生的错误。

The Java Tutorials: Exceptions是关于此主题的绝佳参考。

答案 1 :(得分:2)

JUnit不关心您写入标准输出的内容。如果异常泄露出您的方法,那么JUnit会注意到。

如果你在你的方法中捕获了异常,那么异常的正确行为就不会出现在你的方法中,因为它是(我们希望!)在那里处理的。所以通过测试是一件好事。

你应该测试的是你的方法是否产生了正确的结果(无论是什么),即使在抛出(和处理)异常的情况下也是如此。

答案 2 :(得分:2)

如果向方法添加抛出SQLException,则不必再尝试捕获它。

是的,你可以抓住并抛出异常:

try {
   // some code
}
catch (SomeException e) {
   throw e; 
   // or,
   // throw new SomeOtherException();
}

答案 3 :(得分:0)

那不是完整的代码吗?编译器会抱怨someMethod并不总是返回一个值。

如果你想保持方法不变,那么至少要添加“return null;”在try / catch之后。 这样,如果发生SQLException,那么assertEquals应抛出NullPointerException,这应该适用于您的TestCase。

方面建议,我会在使用之前检查连接是否为空。

答案 4 :(得分:0)

您也可以返回null引用而不是空对象或不完整对象,而不是重新抛出异常。您的呼叫者必须检查null并在DAO无法加载对象时处理该情况。

或者,您可以在JUnit测试中存根log对象,并通过替代构造函数将其注入DAO。您的存根记录器子类可以将消息传递给您的测试以供检查。

答案 5 :(得分:0)

除了Chip Uni上面所说的内容:运行时异常不需要声明, 你还应该注意,例外可以嵌套,即

catch (SqlException e)
{
 throw new RuntimeException(e);
}

这将抛出一个包含SqlExceotion的RuntimeException。