使用JMockit MockUp API,如何模拟静态工厂方法以返回假?
我的问题类似于how do i mock the a static method that provides an instance of the class being mocked with JMockit?,我的协作者的工厂方法在我的测试环境中抛出异常(这是正确的)。因此,我需要嘲笑工厂来剔除有问题的操作。具有工厂方法的类是抽象的,并且只有一个包私有构造函数。
也就是说,给定以下协作者,如何模拟collaboratorFactory()方法以使其返回伪合作者? (协作者是我无法控制的第三方代码。)
public abstract class Collaborator {
public static Collaborator collaboratorFactory() {
//... some operations that throw in test env ...
return new CollaboratorImpl();
}
Collaborator() { }
public int methodToMock() {
return 5;
}
}
我的考试课程确实:
public class ClassUnderTest {
public int getValue() {
return Collaborator.collaboratorFactory().methodToMock();
}
}
我想测试" ClassUnderTest"假冒的合作者,例如,返回来自" methodToMock()"的一些已知值。我已经定义了我的测试类:
public class TestClassUnderTest {
static class MockCollaborator extends MockUp<Collaborator> {
@Mock public int methodToMock() {
return 124;
}
}
@Test
public void test1() throws Exception {
new MockCollaborator();
ClassUnderTest t1 = new ClassUnderTest();
assertEquals(124, t1.getValue());
}
}
当Collaborator.collaboratorFactory()在我的测试环境中抛出异常时,此测试失败。我真正想做的是将collaboratoryFactory()删除,以便它只返回假的Collaborator。可能如下所示:
static class MockCollaborator extends MockUp<Collaborator> {
@Mock public Collaborator collaboratorFactory() {
// ... I don't know what to return here ...
}
}
在collaboratorFactory()模拟方法(上面)的主体中,我尝试返回this.getMockInstance(),但它返回null,因为要模拟的实际方法是静态的。
FWIW,我已经能够使用Expectations API来测试我需要测试的内容,但我觉得这也应该可以使用MockUp API。
感谢任何帮助或建议。
答案 0 :(得分:0)
由于Collaborator是抽象的,我必须使用两个MockUps,一个用于Collaborator,一个用于CollaboratorImpl。抽象类中的工厂方法通过getMockedInstance()返回伪实现类的实例:
static class MockCollaboratorImpl extends MockUp<CollaboratorImpl> {
@Mock public void $init() {};
@Mock public void $clinit() {};
@Mock public int methodToMock() {
return 124;
}
}
static class MockCollaborator extends MockUp<Collaborator> {
@Mock public Collaborator collaboratorFactory() {
return new MockCollaboratorImpl().getMockInstance();
}
}