MTLBuffer
如何利用JMockit测试上述代码?
答案 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
中唯一的被存根("记录")的调用是对于正在测试的代码或要验证的代码具有重要结果的调用。