当前位置: 首页 > 知识库问答 >
问题:

使用JMockit,我如何模拟一个静态工厂方法返回一个假的?

齐涛
2023-03-14

使用JMockit模拟API,我如何模拟一个静态工厂方法来返回一个假的?

我的问题类似于如何模拟一个静态方法,该方法提供了一个用JMockit模拟的类的实例?,但我的合作者的工厂方法在我的测试环境中抛出了一个异常(这是正确的)。因此,我需要模拟工厂来消除有问题的操作。带有工厂方法的类是抽象的,并且只有包私有构造函数。

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();
    }
}
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());
    }

}
    static class MockCollaborator extends MockUp<Collaborator> {
        @Mock public Collaborator collaboratorFactory() {
            // ... I don't know what to return here ...
        }
    }

共有1个答案

孙京
2023-03-14

因为Collaborator是抽象的,所以我必须使用两个模型来完成这个工作,一个用于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();
    }
}
 类似资料: