/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package integrationTests;
import org.junit.*;
import static org.testng.AssertJUnit.*;
import mockit.*;
public final class ClassInitializationTest
{
static final class ClassWhichFailsAtInitialization
{
static
{
//noinspection ConstantIfStatement
if (true) {
throw new AssertionError();
}
}
static int value() { return 0; }
}
@Test
public void usingMockUp()
{
new MockUp<ClassWhichFailsAtInitialization>()
{
// Without this mock (which stubs out static initializers of the class), ALL tests fail as
// a consequence of the class never being successfully initialized due to an exception.
@Mock
void $clinit() {}
@Mock
int value() { return 1; }
};
assertEquals(1, ClassWhichFailsAtInitialization.value());
}
@Test
public void noMockingAtAll()
{
assertEquals(0, ClassWhichFailsAtInitialization.value());
}
@Test
public void usingExpectations()
{
new Expectations()
{
ClassWhichFailsAtInitialization unused;
{
ClassWhichFailsAtInitialization.value(); result = 1;
}
};
assertEquals(1, ClassWhichFailsAtInitialization.value());
}
static class ClassWithStaticInitializer
{
static final String CONSTANT = new String("not a compile-time constant");
static { doSomething(); }
static void doSomething() { throw new UnsupportedOperationException("must not execute"); }
}
@Test
public void mockClassWithStaticInitializerNotStubbedOut()
{
new NonStrictExpectations()
{
@Mocked(stubOutClassInitialization = false)
final ClassWithStaticInitializer mock = null;
};
assert ClassWithStaticInitializer.CONSTANT != null;
ClassWithStaticInitializer.doSomething();
}
@Test
public void useClassWithStaticInitializerNeverStubbedOutAndNotMockedNow()
{
assert ClassWithStaticInitializer.CONSTANT != null;
try {
ClassWithStaticInitializer.doSomething();
fail();
}
catch (UnsupportedOperationException ignore) {}
}
static class AnotherClassWithStaticInitializer
{
static final String CONSTANT = new String("not a compile-time constant");
static { doSomething(); }
static void doSomething() { throw new UnsupportedOperationException("must not execute"); }
int getValue() { return -1; }
}
@Test
public void mockClassWithStaticInitializerStubbedOut(
@Mocked(stubOutClassInitialization = true) AnotherClassWithStaticInitializer mock)
{
assert AnotherClassWithStaticInitializer.CONSTANT == null;
AnotherClassWithStaticInitializer.doSomething();
assert mock.getValue() == 0;
}
@Test
public void useClassWithStaticInitializerPreviouslyStubbedOutButNotMockedNow()
{
assert AnotherClassWithStaticInitializer.CONSTANT == null;
try {
AnotherClassWithStaticInitializer.doSomething();
fail();
}
catch (UnsupportedOperationException ignore) {}
assert new AnotherClassWithStaticInitializer().getValue() == -1;
}
}