6

Can someone explain me why my JUnit test fail:

  • notNullMethodTest() uses @NotNull --> success
  • nonnullMethodTest() uses @Nonnull --> fail

Unexpected exception, expected<java.lang.NullPointerException> but was<java.lang.IllegalArgumentException>

package com;

import java.util.Objects;

import javax.annotation.Nonnull;
import javax.validation.constraints.NotNull;

import org.junit.Test;

public class AnnotationTest {
  private void nonnullMethod(@Nonnull String arg) {
    Objects.requireNonNull(arg);
  }

  @Test(expected = NullPointerException.class)
  public void nonnullMethodTest() {
    nonnullMethod(null);
  }

  private void notNullMethod(@NotNull String arg) {
    Objects.requireNonNull(arg);
  }

  @Test(expected = NullPointerException.class)
  public void notNullMethodTest() {
    notNullMethod(null);
  }
}

Here the StackTrace:

java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<java.lang.IllegalArgumentException>

    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.IllegalArgumentException: Argument for @Nonnull parameter 'arg' of com/AnnotationTest.nonnullMethod must not be null
    at com.AnnotationTest.$$$reportNull$$$0(AnnotationTest.java)
    at com.AnnotationTest.nonnullMethod(AnnotationTest.java)
    at com.AnnotationTest.nonnullMethodTest(AnnotationTest.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19)
    ... 19 more

Thanks

Freddy Boucher
  • 1,387
  • 1
  • 16
  • 27
  • 2
    Possible duplicate of [Why @Nonnull annotation checked at runtime?](http://stackoverflow.com/questions/40847472/why-nonnull-annotation-checked-at-runtime) – Vadim Kirilchuk Apr 04 '17 at 12:40

1 Answers1

11

IntelliJ has recently started generating this assertion code by default. If you don't want this behavior, you can deactivate it in the compiler settings:

Settings dialog

The configuration behind the "configure annotations" button allows you to specify which annotations should be taken into account. This is why it behaves differently when you switch annotations.

barfuin
  • 16,865
  • 10
  • 85
  • 132
  • 1
    You must then rebuild the project. Unchecking this option will not trigger project rebuild. – Dalibor Filus Apr 12 '19 at 21:00
  • 1
    Also, this checkbox produces IllegalArgumentException, but Objects.requireNonNull throws NPE, Lombok throws NPE, gradle lombok plugin throws NPE, just IDEA is throwing IAE for the same test for which gradle throws NPE. Ugh. – Dalibor Filus Apr 12 '19 at 21:01