jeudi 23 juin 2016

Using jmockit to mock constructor that throws error: NoClassDefFoundError

Jmockit is very powerful, but sometimes I cannot understand what it does behind the scene, so I have a question regarding jmockit. Hopefully the more experienced programmers on here could help shine some light on this situation :)

I have the following two classes in two separate files:

public class SmallClass {
    String a;
    SmallClass(String arg) throws Exception {
        a = arg;
    }
    public String getString() {
        return a;
    }
}

And

public class BigClass {
    private static final SmallClass smallClass;
    static {
        try {
            smallClass = new SmallClass("dummy");
        } catch (Exception e) {
            throw new IllegalStateException("Could not initialized", e);
        }
    }
    public static String getString() {
        return smallClass.getString();
    }
}

Now, I have a class to test BigClass:

public class BigClassTest {
    @Test
    public void testGet() throws Exception {
        ///CLOVER:OFF
        new MockUp<SmallClass>() {
            @Mock
            public void $init(String string) throws Exception {
                //Do nothing
            }
            @Mock
            public String getString() {
                return "dummyString";
            }
        };
        ///CLOVER:ON
        Assert.assertEquals("dummyString", BigClass.getString());
    }

    @Test(expected = ExceptionInInitializerError.class)
    public void testException() throws Exception {
        ///CLOVER:OFF
        new MockUp<SmallClass>() {
            @Mock
            public void $init(String string) throws Exception{
                throw new Exception("Mocked Exception");
            }
        };
        ///CLOVER:ON
        BigClass.getString();
    }
}

If I run each of these independently, then they each passes. But if I run the whole test file, then the first test fails with:

java.lang.NoClassDefFoundError: Could not initialize class BigClass

I also tried tearing down the mock after each test like this, but it doesn't help:

public class BigClassTest {
    MockUp<SmallClass> smallClassMockUp;

    @Test
    public void testGet() throws Exception {
        ///CLOVER:OFF
        smallClassMockUp = new MockUp<SmallClass>() {
            @Mock
            public void $init(String string) throws Exception {
                //Do nothing
            }
            @Mock
            public String getString() {
                return "dummyString";
            }
        };
        ///CLOVER:ON
        Assert.assertEquals("dummyString", BigClass.getString());
        smallClassMockUp.tearDown();
    }

    @Test(expected = ExceptionInInitializerError.class)
    public void testException() throws Exception {
        ///CLOVER:OFF
        smallClassMockUp = new MockUp<SmallClass>() {
            @Mock
            public void $init(String string) throws Exception{
                throw new Exception("Mocked Exception");
            }
        };
        ///CLOVER:ON
        BigClass.getString();
        smallClassMockUp.tearDown();
    }
}

Any help would be appreciated. Thank you in advance!

Aucun commentaire:

Enregistrer un commentaire