2016-04-27 70 views
1

我在java类有方法:期待自定义异常,而不是空指针异常而JUnit的测试

@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(); 
    } 
} 

当我的JUnit测试上面的方法为预期时UserIdNotFoundException userid参数是空的,我得到以下声明错误:expected an instance of UserIdNotFoundException but <java.lang.NullPointerException> is java.lang.NullPointerException

@Test 
public void testProcessRequest_throws_UserIdNotFoundException() 
{ 
    expectedException.expect(UserIdNotFoundException.class); 
    processRequest(null); 
} 

我的自定义异常类:

public class UserIdNotFoundException extends Exception 
{ 

    public UserIdNotFoundException() 
    { 

    } 

    public UserIdNotFoundException(String message) 
    { 
      super(message); 
    } 
} 

回答

2

我更喜欢注解:

@Test(expected = UserIdNotFoundException.class) 
public void testProcessRequest_throws_UserIdNotFoundException() { 
    processRequest(null); 
} 

的问题可能是你的processRequest执行可能击中NPE你有机会来检查用户ID之前。

这是一件好事:您的测试显示实施不符合您的要求。你现在可以永远修复它。

这就是TDD的好处。

+0

我的执行如何在检查之前触发空指针异常。我不调用userId上的任何字符串方法。或者我没有明白你的观点。此外,我将userId作为来自Url的查询参数。唯一的可能是它可能涉及一些空的检查。 – Ashley

+1

您必须发布processRequest的实现以供我为您拼写。一个更好,更教育的想法可能是在调试器中逐步完成该过程。在processRequest的第一行放置一个断点,看看观察到的行为与您的期望不符。 – duffymo

+0

我按照你的建议进行了调试。该错误显示在行uriInfo.getBaseUri()。toString()它似乎。因此,我把这条线后if检查。测试现在显示绿色栏。但我仍然没有得到理由。 – Ashley

0

你必须编写自定义异常类this example可以帮助你。

示例代码:

class UserIdNotFoundException extends Exception{ 
UserIdNotFoundException (String s){ 
    super(s); 
} 
} 

测试异常:从您的异常类

public void processRequest(String userId) 
{ 
    if(userId == null) 
    { 
     //UserIdNotFoundException is my custom exception which extends Exception 
     throw new UserIdNotFoundException("SOME MESSAGE"); 
    } 
} 

删除默认的构造函数,JVM隐式创建为你/

+0

我写了我的自定义异常类,但仍然得到相同的断言错误。 – Ashley

+0

更新的答案,试试。 –

+0

移除构造函数将如何解决上述问题? – Ashley

0

你可能没有没有设定值uriInfo并且您打电话一个空值的方法。你确定你的测试设置为uriInfo?或者getBaseUri()可能会返回null并且调用toString()就可能会抛出NullPointerException。这可以通过在调试器中检查返回值getBaseUri()来完成。

通常情况下,您可以使用包含bean的配置为测试运行测试,也可以添加setter以设置测试类中的值以模拟测试或给出测试值。这应该有助于避免NullPointerException

无论哪种方式,你应该总是做一个方法中的任何真正的工作之前的失败验证。