在junit测试时期望自定义异常而不是空指针异常

时间:2016-04-27 12:48:12

标签: java unit-testing exception nullpointerexception mockito

我在java类中有方法:

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

3 个答案:

答案 0 :(得分:2)

我更喜欢注释:

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

问题可能是您的processRequest实施可能会在您有机会检查用户ID之前触及NPE。

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

这就是TDD的好处。

答案 1 :(得分:0)

您必须编写自定义异常类this example可能对您有帮助。

示例代码:

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

测试例外:

function RestartService(service)
{
    var target = document.getElementById('page');
    var spinner = new Spinner(opts).spin(target);

    var data = new FormData();
    data.append('service', service);

    var xhReq = new XMLHttpRequest();
    xhReq.open("POST", "/rservice.php", false);
    xhReq.send(data);
    var serverResponse = xhReq.responseText;

    timeout = setTimeout(
        function ()
        {
            spinner.stop();
        }, 1500);

    return serverResponse;
}

从异常类中删除默认构造函数,JVM为您隐式创建它/

答案 2 :(得分:0)

您可能没有为uriInfo设置值,而是在空值上调用方法。你确定你的测试设置为uriInfo给出了值吗?或者getBaseUri()可能正在返回null,并且在其上调用toString()可能会抛出NullPointerException。这可以通过检查调试器中getBaseUri()的返回值来完成。

通常,您可以使用带有测试bean的配置运行测试,也可以添加setter来设置测试类中的值以模拟它或在测试中给出值。这应该有助于避免NullPointerException

无论哪种方式,您都应该在方法中进行任何实际工作之前始终进行失败验证。