Expecting custom exception instead of null pointer exception while junit testing
我在java类中有方法:
1 2 3 4 5 6 7 8 9 10 11
| @ Context
UriInfo uriInfo ;
public void processRequest (@QueryParam ("userId") @DefaultValue ("") String userId )
{
String baseURI = uriInfo. getBaseUri(). toString();
if(userId == null)
{
//UserIdNotFoundException is my custom exception which extends Exceptition
throw new UserIdNotFoundException ();
}
} |
当我正在测试上述方法时,当userId参数为Null时,期望UserIdNotFoundException,我得到以下断言错误:expected an instance of UserIdNotFoundException but is java.lang.NullPointerException。
1 2 3 4 5 6
| @Test
public void testProcessRequest_throws_UserIdNotFoundException()
{
expectedException.expect(UserIdNotFoundException.class);
processRequest(null);
} |
我的自定义异常类:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class UserIdNotFoundException extends Exception
{
public UserIdNotFoundException ()
{
}
public UserIdNotFoundException (String message )
{
super(message );
}
} |
我更喜欢这个注释:
1 2 3 4
| @Test(expected = UserIdNotFoundException.class)
public void testProcessRequest_throws_UserIdNotFoundException() {
processRequest(null);
} |
问题可能是您的processRequest实现可能会在您有机会检查用户ID之前触及NPE。
这是一件好事:您的测试表明实施不符合您的要求。你现在可以永远修复它。
这就是TDD的好处。
-
在我的检查之前,我怎样才能实现空指针异常。我没有在userId上调用任何字符串方法。或者我没有明白你的观点。此外,我将来自Url的userId作为Query Param。唯一可能的是它可能涉及一些空检查。
-
您必须为我发布processRequest的实现,以便为您拼出。一个更好,更有教育意义的想法可能是在调试器中逐步完成该过程。在processRequest的第一行放置一个断点,看看观察到的行为与您的期望不符。
-
我按你的建议调试了它。错误显示在uriInfo.getBaseUri()。toString()行上。所以我把那行放在if检查之后。测试现在显示绿色条。但我仍然没有得到理由。
-
我仍然不明白为什么在使用uriInfo时它会击中NPE
-
你仍然没有发布实施,所以我无法帮助你。你应该能够解决这个问题。
-
@Ashley可能getBaseUri()返回null并在其上调用toString()抛出NullPointer
-
@duffymo是的,实现部分发布,请参阅方法中添加的String baseURI = uriInfo.getBaseUri().toString();和uriInfo变量声明@Context
您可能没有使用值设置uriInfo,并且您在空值上调用方法。你确定你的测试设置为uriInfo的值吗?或者getBaseUri()可能正在返回null并且在其上调用toString()可能会抛出NullPointerException。这可以通过检查调试器中getBaseUri()的返回值来完成。
通常,您可以使用带有测试bean的配置来运行测试,也可以添加setter来设置测试类中的值以模拟它或在测试中给出值。这应该有助于避免NullPointerException。
无论哪种方式,您都应该在进行方法中的任何实际工作之前始终执行失败验证。
您必须编写自定义Exception类,此示例可能对您有所帮助。
示例代码:
1 2 3 4 5
| class UserIdNotFoundException extends Exception{
UserIdNotFoundException (String s ){
super(s );
}
} |
测试例外:
1 2 3 4 5 6 7 8
| public void processRequest (String userId )
{
if(userId == null)
{
//UserIdNotFoundException is my custom exception which extends Exception
throw new UserIdNotFoundException ("SOME MESSAGE");
}
} |
从您的异常类中删除默认构造函数,JVM隐式为您创建它/
-
我编写了自定义异常类但仍然遇到相同的断言错误。
-
更新了答案,试一试。
-
如何删除构造函数解决上述问题?
-
我不是说它会解决这个问题,但不是必须的。
-
不是如何扩展Exception的好例子。只有一个构造函数;我建议覆盖所有四个。
-
@duffymo,大多数人创建一个构造函数。让我们知道任何具体理由来覆盖四个
-
"大多数人" - 没有数据支持。当我扩展Exception时,我要求IntelliJ覆盖所有构造函数。这很简单。没理由不去。