JUnit @Test expected annotation not working
Asked Answered
A

8

36

I've got the following test:

@Test(expected = IllegalStateException.class)
public void testKey() {
    int key = 1;
    this.finder(key);
}

But JUnit reports, that the test fails, although it throws — as expected — an IllegalStateException.

Do I have to configure something else to make this run?


I run the test now with

@RunWith(Suite.class)
@SuiteClasses(Test.class)
public class TestSuite {

}

like in this question, but am still not getting the desired result.

And when I remove the test prefix I'm still getting an error.

I gotta say that I run these tests with Eclipse, but it's configured to use the JUnit 4 Runner.

Alexaalexander answered 5/4, 2011 at 10:3 Comment(5)
Maybe you are inadvertently running the test with JUnit 3. Does the test class extend TestCase? What happens when you change the name of the test method so that it no longer starts with test?Guggle
When the test's name doesn't start with test, I get the message junit.framework.AssertionFailedError: No tests found in MyClassAlexaalexander
And yes, the class extends TestCase.Alexaalexander
Well then it's clear - you are mixing JUnit 3 and JUnit 4 features, which doesn't work. Either write your test in JUnit 3 style, or in JUnit 4 style.Guggle
Might be you're importing something other than org.junit.jupiter.api.Test.Domestic
A
51

The problem was, that the class in which the test was nested was an extension of TestCase. Since this is JUnit 3 style, the annotation didn't work.

Now my test class is a class on its own.

Alexaalexander answered 5/4, 2011 at 11:6 Comment(0)
A
10
@RunWith(JUnit4.class)
public class MyTestCaseBase extends TestCase 

I also had problems with @Test(expected = ...) annotation when I extended TestCase class in my base test. Using @RunWith(JUnit4.class) helped instantly (not an extremely elegant solution, I admit)

Angel answered 9/12, 2014 at 18:53 Comment(1)
You should not extend TestCase anymore with JUnit4+.Clad
R
7

i tried this one, and work perfectly as expected.

public class SampleClassTest {
    @Test(expected = ArithmeticException.class )
    public void lost(){
        this.lost(0);
    }
    private void lost(int i) throws ArithmeticException {
        System.out.println(3/i);
    }
}

also ensure that junit4 is added as dependancy, @ (annotations) are new feature in junit 4.

Recha answered 20/11, 2012 at 11:26 Comment(0)
B
6

I faced same issue, solution is simple "Don't extends TestCase class"

Bloke answered 2/1, 2014 at 11:1 Comment(0)
G
3

No, this JUnit test should work as it is - there is nothing more needed on this side.

What makes you sure that the test throws an IllegalStateException? Is it possible that it gets wrapped into another exception of different type?

Please post the exact failure message from JUnit.

As @duffymo suggested, it is easy to verify what (if any) exception the test really throws.

Gall answered 5/4, 2011 at 10:10 Comment(2)
JUnit's message: java.lang.IllegalStateException: ... MyErrorMessage ..Alexaalexander
Yes, it's possible for the exception to be wrapped into another one, but in that case you should assert the wrapper one, and never the other.Nugent
P
3

I had the same problem I just changed my imports statements. I removed :

import org.junit.jupiter.api.Test;

import junit.framework.TestCase;

and added :

import org.junit.Test;

And it worked fine for me.

Passible answered 14/1, 2018 at 12:23 Comment(0)
C
2

This looks correct to me.

Check your assumptions. Are you sure it throws the exception? If what you say is true, removing the expected from the annotation should make it fail.

I'd be stepping through the code with a debugger to see what's going on. I'll assume you have an IDE that will do so, like IntelliJ.

Charactery answered 5/4, 2011 at 10:9 Comment(0)
S
0

Just tested this under JUnit4: this DO work, test completes successfully. Look if it is a IllegalSelectorException or such.

Stabile answered 5/4, 2011 at 10:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.