fumeng
fumeng

Reputation: 1830

JUnit test not catching exception

UPDATE: Here's the full test:

@Test(expected = NullPointerException.class)
public void testMissingData() throws Exception{
Resource<ObjectDataModel, Content, Status> resource = builder.build(content,  argA1Response, 
            argA2Response, objFilterParam, argA3Response);}

And here's the build method:

public Resource<ObjectDataModel, Content, Status> build(Content argContent,
        ResponseA1 argA1Response,
        ResponseA2 argA2Response, String argObjectTypeFilter,
        ResponseA3 argA3Response) {

    try {
        viewDataModel.setObjectType(this.buildObjectType(filteredObjectType,
                argA1Response.getData().getDataObject().getCategories().get(0).getObjectTypes().get(0)));

    }
    catch (Exception e) {
        String msg = "Exception occoured while buildng the Object Data Model";
        LOG.error(msg, e);
    }

    // we have the required information gathered to return
    return Resource.okFromDataAndContent(viewDataModel, argContent);
}

And here's the buildObjectType() method:

private ObjectType buildObjectType(ObjectTypes argA1ProductType,
        PendingObjectTypes argA2ProductType) {
    ProductType objectType = new ObjectType();
    List<Plan> plans = argA1ObjectType.getPlan();
    List<PendingObjectSummary> objPlans = argA1ObjectType.getData();

    if (objectType.getData() == null) {
        objectType.setData(new ArrayList<>());
    }

    PendingObjectSummary tempPlan = null;
    for (Plan currPlan : plans) {
        tempPlan = plans.stream()
                        .filter(plan -> plan.getObjId().equals(currPlan.getObjId()))
                        .findFirst()
                        .orElseThrow(NullPointerException::new);

    }

    return objectType;
}

I'm using an Optional to test for null and I can confirm that the exception is being thrown -- but JUnit isn't catching it. Here's the test case:

@Test(expected = NullPointerException.class)
public void testMissingData() throws Exception{
    Object<> response = fixture.create();

    assertNotNull(response);
    assertNotNull(response.getData());

    assertNull(resource.getData().getObjectType()); 
}

In my create method I'm simply iterating over a bunch of objects to try and find one that matches my ID; if not found then throw a NullPointerException:

for (Object currObj : objects) {
        tempObj = myOtherCollection.stream()
                        .filter(obj -> obj.getId().equals(currObj.getId()))
                        .findFirst()
                        .orElseThrow(NullPointerException::new);
    }

The JUnit output clearly isn't catching the exception - here's the output:

java.lang.AssertionError: Expected exception: java.lang.NullPointerException

And my tomcat logs are definitely throwing the exception here:

18:48:30.015 [main] ERROR com.myCompany.src.ModelBuilder - Exception occoured while buildng the Data Model
java.lang.NullPointerException: null
at java.util.Optional.orElseThrow(Optional.java:290)

The only issue I can see is that maybe where I assign tempObj that the code is wrong. Am I missing anything obvious? Thanks for any helpful tips.

Upvotes: 0

Views: 2294

Answers (2)

noname
noname

Reputation: 565

So what you could do is

public Resource<ObjectDataModel, Content, Status> build(Content argContent,
        ResponseA1 argA1Response,
        ResponseA2 argA2Response, String argObjectTypeFilter,
        ResponseA3 argA3Response) throws NullPointerExceptions // << notice thrwoing declatration
{ // do some stuf} 

and then in test you can handle it like you where trying by

public void testMissingData() throws Exception{
Resource<ObjectDataModel, Content, Status> resource = builder.build(content,  argA1Response, 
            argA2Response, objFilterParam, argA3Response);
}

Upvotes: 0

lugiorgi
lugiorgi

Reputation: 546

You are catching the nullpointer exception so the exception is not propagated to your test.

see

try {
    viewDataModel.setObjectType(this.buildObjectType(filteredObjectType,
            argA1Response.getData().getDataObject().getCategories().get(0).getObjectTypes().get(0)));

}
catch (Exception e) {
    String msg = "Exception occoured while buildng the Object Data Model";
    LOG.error(msg, e);
}

If you want to test for an exception you could throw an exception in your error handling (for example a custom ObjectCreationExcepion) and assert that that one is thrown, like

try {
    viewDataModel.setObjectType(this.buildObjectType(filteredObjectType,
            argA1Response.getData().getDataObject().getCategories().get(0).getObjectTypes().get(0)));

}
catch (Exception e) {
    String msg = "Exception occoured while buildng the Object Data Model";
    LOG.error(msg, e);
    throw new ObjectCreationException(msg);
}

and in your test

@Test(expected = ObjectCreationException.class) 
public void testMissingData() throws Exception{
    Object<> response = fixture.create();  
}

@Test(expected = ObjectCreationException.class) only handles exceptions that are not handled within the tested code OR the test itself.

Upvotes: 3

Related Questions