繁体   English   中英

使用JMockit,如何模拟静态工厂方法以返回假?

[英]Using JMockit, how do I mock a static factory method to return a Fake?

使用JMockit MockUp API,如何模拟静态工厂方法以返回假?

我的问题类似于我如何模拟一个静态方法,该方法提供了一个用JMockit模拟的类的实例? 添加了皱纹,我的协作者的工厂方法在我的测试环境中引发异常(这是正确的)。 因此,我需要嘲笑工厂来剔除有问题的操作。 具有工厂方法的类是抽象的,并且只有一个包私有构造函数。

也就是说,给定以下协作者,如何模拟collaboratorFactory()方法以使其返回伪合作者? (Collaborator是我无法控制的第三方代码。)

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

我想用一个假的Collaborator测试“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。

任何帮助或建议表示赞赏。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM