private Mockery context = new JUnit4Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
注意這里的setImposteriser(ClassImposteriser.INSTANCE);
因為默認的JUnit4Mockery的Imposteriser是JavaReflectionImposteriser,他是針對接口進行mock的,如果要針對class進行mock,必須setImposteriser(ClassImposteriser.INSTANCE);
這樣之后context便可以對class進行mock了
官方的文檔:
Mocking Classes with jMock and the ClassImposteriser
Because it uses Java's standard reflection capability, the default
configuration of the jMock framework can only mock interfaces, not classes.
(Actually, we consider that to be a good thing because it encourages the
design to focus on communication between objects rather than static
classification or data storage). However, the ClassImposteriser
extension class uses the CGLIB 2.11
and Objenesis2 libraries to
create mock objects of classes as well as interfaces. This is useful when
working with legacy code to tease apart dependencies between tightly coupled
classes.
To use the ClassImposteriser
:
- Add jmock-legacy-2.1.0-RCn.jar, cglib-nodep-2.1_3.jar and
objenesis-1.0.jar to your CLASSPATH.
- Plug the
ClassImposteriser
into the Mockery of your test
class:
Raw
import org.jmock.Mockery;
import org.jmock.Expectations;
import org.jmock.lib.legacy.ClassImposteriser;
public class ConcreteClassTest extends TestCase {
private Mockery context = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
...
}
JUnit 3
import org.jmock.Expectations;
import org.jmock.integration.junit3.MockObjectTestCase;
import org.jmock.lib.legacy.ClassImposteriser;
public class ConcreteClassTest extends MockObjectTestCase {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
...
}
JUnit 4
import org.jmock.Mockery;
import org.jmock.Expectations;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
@RunWith(JMock.class)
public class ConcreteClassTest {
private Mockery context = new JUnit4Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
...
}
- Your tests can now create mocks of abstract or even concrete classes:
Graphics g = context.mock(java.awt.Graphics.class);