如何使用 JMock 在 java 中模拟静态变量

发布于 2024-08-04 07:57:19 字数 322 浏览 10 评论 0原文

我有一个单元测试问题,其中一个类有一个静态变量想要加载 Spring 应用程序 Ctx。

这个类不是来自 Bean Factory,我无法改变这个事实。

static ApplicationContext applicationContext = ...;

这工作正常,但是很难JMock,或者至少我不知道一种方法在我可以之前,Spring Ctx 想要启动。不适合单元测试情况。

有没有人知道的解决办法? 我可以选择将静态变量更改为我想要的任何内容。

谢谢。

I have a Unit testing problem where a class has a static variable which wants to load the Spring Application Ctx.

This class DOES NOT come out of the Bean Factory and I cannot change this fact.

static ApplicationContext applicationContext = ...;

This works fine, but is hard to JMock, or atleast I don't know a way and until I can the Spring Ctx wants to start up. Not ideal for a unit test situation.

Is there a work around that anyone knows?
I have the option to change the static variable to anything I wish..

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半岛未凉 2024-08-11 07:57:19

我自己解决了这个问题。

最后真的很简单。只是需要将我的静态包装在一个类中,然后我可以模拟它。

public class ApplicationContextHolder implements ApplicationContextHoldable {

    protected static ApplicationContext applicationContext = ...;

    @Override
    public ApplicationContext getApplicationContext() {
        return ApplicationContextHolder.applicationContext;
    }

}

Solved this myself.

Was really simple in the end. Justed need to wrap my static in a class which I could then mock.

public class ApplicationContextHolder implements ApplicationContextHoldable {

    protected static ApplicationContext applicationContext = ...;

    @Override
    public ApplicationContext getApplicationContext() {
        return ApplicationContextHolder.applicationContext;
    }

}
梦途 2024-08-11 07:57:19

好的。讽刺的是,Spring 擅长的一件事是管理单例,所以不需要静态变量:)

Nice. The irony is that the one thing that Spring is good at is managing Singletons, so there shouldn't be a need for static variables :)

等风来 2024-08-11 07:57:19

您可以使用基于反射的 JMock API 来设置私有/静态字段

    import static mockit.Deencapsulation.setField;
    //Test method
    public void testSample {
        setField(Sample.class,"isPrivate",true);
        setField(Sample.class,"isStatic",true);
    }

    private class Sample {
        private boolean isPrivate = false;
        private boolean isStatic = false;

    }

You can use reflection based JMock APIs to set private / static fields

    import static mockit.Deencapsulation.setField;
    //Test method
    public void testSample {
        setField(Sample.class,"isPrivate",true);
        setField(Sample.class,"isStatic",true);
    }

    private class Sample {
        private boolean isPrivate = false;
        private boolean isStatic = false;

    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文