【问题标题】:Mocking non-public static methods in abstract classes with JMockit?使用 JMockit 在抽象类中模拟非公共静态方法?
【发布时间】:2010-09-18 11:48:05
【问题描述】:

我有以下课程:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}

我想模拟这个方法。我决定使用JMockit。所以我创建了一个模拟类:

public class MockParent {
    static String method() {
        return "MOCK";
    }
}

我的测试代码如下所示:

public class RealParentTest {

    @Before
    public void setUp() throws Exception {
        Mockit.redefineMethods( AbstractParent.class, MockParent.class );
    }


    @Test
    public void testMethod() {
        assertEquals(MockParent.method(),AbstractParent.method());
    }

}

不幸的是,这个测试表明 AbstractParent 返回“OriginalOutput”而不是“MOCK”。任何想法为什么?难道我做错了什么?我也尝试将我的模拟类声明为抽象类,但无济于事。

编辑请注意,将方法设为公开会导致测试正常运行...这很奇怪,因为使用 JMockit 您应该能够模拟任何范围的方法。

回答只有mock方法需要公开,你可以保留原来的方法。

【问题讨论】:

  • 只是为了路过的 googler.. 接受的答案现在已经过时了,因为 Mockit.redefineMethods 已被弃用...我正在努力寻找正确的答案。

标签: java unit-testing mocking jmockit


【解决方案1】:

找到解决方案:您只需将 mock 的方法公开(原始方法可以保持其原始可见性)。

我不知道为什么这行得通,而原来的方式不行(非常欢迎有人加入),但您只需将上面示例中的模拟类更改为:

public class MockParent {
    public static String method() {
        return "MOCK";
    }
}

【讨论】:

  • 您甚至不必在 MockParent 中将其设为静态。
  • jmockit 只查看公共方法。这允许您的模拟实现具有与源类中的方法不对应的内部方法
  • mock方法需要pu​​blic的原因是JMockit修改了mocked方法来调用mock方法。也就是说,对原始方法的调用会从同一方法内部重定向到模拟。因此,必须可以从插入调用的那一点访问模拟方法。
【解决方案2】:

显然,这样做的新方法是使用MockUp<T>

new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

assertEquals("MOCK" AbstractParent.method());

另一种选择显然是继续使用 MockParent 之类的 @MockClass 注释。我自己没有这样做,因为另一个内联版本可以完成这项工作。

我已经在一个示例中实现了这一点 project on github

【讨论】:

  • 原来的AbstractParent.method()staticstatic 方法不能采用这种方式。
  • 很抱歉我之前的评论,实际上我尝试过但它并没有真正起作用,然后我才知道那是因为完全不同的东西。 +1 提供示例。
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多