Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JUnit test fails when method arg is annotated @Nonnull

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

like image 299
Freddy Boucher Avatar asked Feb 04 '17 03:02

Freddy Boucher


Video Answer


1 Answers

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.

like image 171
barfuin Avatar answered Sep 28 '22 05:09

barfuin