如何解决BDDMockito`given...willReturn...`仅调用一次模拟,而不是每次调用`given函数
我在实用程序类中定义了一个静态方法,该类在Unix环境中执行shell命令:
public final class Shell {
public static String execute(String[] commands,long timeout) {
//do stuff
}
}
此方法用于在环境上执行Bash命令,这意味着我们不仅返回String
包含特定命令的输出,而且该命令本身可能会发生一些影响
例如,在特定情况下,该命令将生成一个.out
文件,并以String
的形式返回操作状态。
出于测试目的,我需要模拟此调用。因此,我需要它来生成.out
文件作为模拟文件并返回内容。
为此,我使用了BDDMockito
和PowerMockito
,如下所示:
PowerMockito.mockStatic(Shell.class);
BDDMockito.given(Shell.execute(eq(specificArgument),anyLong()).willReturn(mock_out_execution());
...其中mock_out_execution()
是一个函数,它在工作目录上创建.out
文件,然后返回成功状态-模拟在真实Unix环境中的执行。
背景信息:
.out
文件由读取,执行某些操作然后将其删除的进程处理。这些信息对于理解我的问题很重要。
现在,在执行集成测试期间,
-
execute()
的{{1}}方法被称为第一次。将创建一个Shell
文件。 -
.out
文件因此被主线程处理并删除 -
.out
的{{1}}方法被称为第二次。应该重新创建一个execute()
文件。 - 因此
Shell
文件应再次处理,并在完成后删除。
问题是.out
在模拟被初始化时仅执行一次。
这意味着第一次调用.out
时,BDDMockito.given(...).willReturn(...)
文件在那里,进程可以对其进行处理。
但是,第二次调用execute()
时,将不再执行任何操作,因此缺少新的.out
文件,并且代码执行失败。
如何解决这个问题?每次调用我要模拟的方法时,使用execute()
实际调用模拟的正确方法是什么?
解决方法
使用willReturn
时会传递一个常量对象,该对象将立即计算。如果您想返回动态的东西(在通话时 为每个通话分别计算),则必须使用willAnswer()
。
您传递的答案对象基本上是一个将调用(有关调用的所有数据都在此对象中)转换为每次调用的具体结果的函数。
编辑:
尝试过这个,效果很好。也许在比较笔记时会有所帮助:
// Mocked service
package stuff;
public class StaticService {
public static String fetchStuff() {
return "Stuff";
}
}
// Test class
package stuff;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.BDDMockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(fullyQualifiedNames = "stuff.StaticService")
public class PowerMockitoTest {
@Test
public void testStatic() {
PowerMockito.mockStatic(StaticService.class);
AtomicInteger cnt = new AtomicInteger(0);
BDDMockito.given(StaticService.fetchStuff()).willAnswer(invocation -> Integer.toString(cnt.getAndIncrement()));
System.out.println(StaticService.fetchStuff());
System.out.println(StaticService.fetchStuff());
}
}
结果
0
1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。