首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Mockito在Spring Boot中模拟异步(@Async)方法?

如何使用Mockito在Spring Boot中模拟异步(@Async)方法?
EN

Stack Overflow用户
提问于 2016-08-18 18:42:06
回答 2查看 4.2K关注 0票数 7

用mockito模拟异步(@Async)方法的最好方法是什么?提供的服务如下:

代码语言:javascript
运行
复制
@Service
@Transactional(readOnly=true)
public class TaskService {
    @Async
    @Transactional(readOnly = false)
    public void createTask(TaskResource taskResource, UUID linkId) {
        // do some heavy task
    }
}

Mockito的验证如下:

代码语言:javascript
运行
复制
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {
    @Autowired
    MockMvc mockMvc;
    @MockBean    
    private TaskService taskService;
    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();

    // other details omitted...

    @Test
    public void shouldVerify() {
        // use mockmvc to fire to some controller which in turn call taskService.createTask
        // .... details omitted
        verify(taskService, times(1)) // taskService is mocked object
            .createTask(any(TaskResource.class), any(UUID.class));
    } 
}

上面的测试方法shouldVerify总是会抛出:

代码语言:javascript
运行
复制
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:

-> at SomeTest.java:77) // details omitted
-> at SomeTest.java:77) // details omitted 

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
    when(mock.get(anyInt())).thenReturn(null);
    doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
    verify(mock).someMethod(contains("foo"))

Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.

如果我从TaskService.createTask方法中删除@Async,上面的异常就不会发生。

Spring Boot版本:1.4.0.RELEASE

Mockito版本: 1.10.19

EN

Stack Overflow用户

发布于 2016-08-19 18:33:17

我们希望在1.4.1中修复一个bug in Spring Boot。问题是您的模拟TaskService仍然被异步调用,这破坏了Mockito。

您可以通过为TaskService创建一个接口并创建一个模拟接口来解决这个问题。只要您只在实现上保留@Async注释,事情就会正常进行。

如下所示:

代码语言:javascript
运行
复制
public interface TaskService {

    void createTask(TaskResource taskResource, UUID linkId);

}

@Service
@Transactional(readOnly=true)
public class AsyncTaskService implements TaskService {

    @Async
    @Transactional(readOnly = false)
    @Override
    public void createTask(TaskResource taskResource, UUID linkId) {
        // do some heavy task
    }

}
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39016119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档