我有一个转到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");
}
}
答案 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。