如何在Java中使用jmockit模拟静态链接方法

时间:2017-04-21 00:16:27

标签: java junit jmockit

MTLBuffer

如何利用JMockit测试上述代码?

2 个答案:

答案 0 :(得分:2)

您提供的链式方法等同于以下内容:

InetAddress localHost = InetAddress.getLocalhost();
String hostName = localHost.getHostName();

因此,我们需要将其分解为两个模拟。

第二部分很容易通过模拟InetAddress并将其放在Expectations块中来完成:

@Test
public void myTest(@Mocked InetAddress mockedLocalHost) throws Exception {

    new Expectations() {{
       mockedLocalHost.getHostName();
       result = "mockedHostName";
    }};

    // More to the test
}

但是,当我们调用mockedLocalHost时,我们如何让InetAddress.getLocalhost()成为返回的实例?使用partial mocking,可用于任何静态方法。其语法是将包含静态方法的类作为new Expecations()的参数包含在内,然后像对待任何其他方法一样模拟它:

@Test
public void myTest(@Mocked InetAddress mockedLocalHost) throws Exception {

    new Expectations(InetAddress.class) {{
       InetAddress.getLocalHost();
       result = mockedLocalHost;

       mockedLocalHost.getHostName();
       result = "mockedHostName";
    }};

    // More to the test
}

这将导致您按计划模拟InetAddress.getLocalHost().getHostName()

答案 1 :(得分:1)

宣布@Mocked InetAddress var1就足够了。默认情况下,@Mocked类型的所有方法(包括静态方法)都会返回模拟。然后,Expectations中唯一的被存根("记录")的调用是对于正在测试的代码或要验证的代码具有重要结果的调用。