【发布时间】:2018-12-09 15:59:33
【问题描述】:
我的项目使用JUnit、Mockito、PowerMockito 创建单元测试。代码如下:
public class FirstController {
public void doSomething() {
ServiceExecutor.execute();
}
}
public class ServiceExecutor {
private static final List<Service> services = Arrays.asList(
new Service1(),
new Service2(),
...
);
public static void execute() {
for (Service s : services) {
s.execute();
}
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceExecutor.class})
public class FirstControllerTest {
@Before
public void prepareForTest() {
PowerMockito.mockStatic(ServiceExecutor.class);
PowerMockito.doNothing().when(ServiceExecutor.class)
}
@Test
public void doSomethingTest() {
FirstController firstController = new FirstController();
firstController.doSomething();
PowerMockito.verifyStatic(ServiceExecutor.class, Mockito.times(1));
}
}
本期完整源码:https://github.com/gpcodervn/Java-Tutorial/tree/master/UnitTest
我想验证运行的ServiceExecutor.execute() 方法。
当调用execute() 方法时,我尝试模拟ServiceExecutor 和doNothing()。但我对ServiceExecutor 中的private static final List<Service> services 有疑问。它总是为每个服务构造新的实例。每个服务创建新实例的时间更长,如果我模拟每个Service,我不知道他们以后会有多少服务。
你有什么想法在FirstController 中验证ServiceExecutor.execute() 而不在ServiceExecutor 中运行任何方法吗?
【问题讨论】:
-
如果您要创建
ServiceExecutor的实例,为什么首先需要将execute方法设为static? -
谢谢,@QBrute。这是我的错误。我已经更新了代码。
-
老实说,在考虑测试之前重构以避免全局状态。 (或者,不要使用全局状态开头。)
-
没有办法。因为这个服务是由其他项目创建的。在我的控制器中,我想测试这个方法,我必须模拟这个服务。
-
添加您目前编写的测试代码。列出的相关问题没有帮助吗?
标签: java junit mockito powermock