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

尤迪斯提拉(Yudhistira Arya)

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

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

Mockito的验证如下:

@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上面的测试方法将始终抛出:

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.

如果我@AsyncTaskService.createTask方法中删除,则不会发生上述异常

Spring Boot版本:1.4.0.RELEASE

Mockito版本:1.10.19

尤迪斯提拉(Yudhistira Arya)

发现通过将异步模式更改为AspectJ可以解决此问题:

@EnableCaching
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(lazyInit = true) 
@EnableAsync(mode = AdviceMode.ASPECTJ) // Changes here!!!
public class Main {
    public static void main(String[] args) {
        new SpringApplicationBuilder().sources(Main.class)
                                    .run(args);
    }
}

在我理解此问题的真正根源之前,我将其作为临时的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Mockito-在异步方法中模拟正在测试的方法

来自分类Dev

如何使用Mockito模拟受保护的方法?

来自分类Dev

如何使用ts-mockito模拟方法?

来自分类Dev

如何使用 Mockito 模拟列表方法

来自分类Dev

如何使用Mockito模拟For循环

来自分类Dev

如何使用Mockito模拟WebDriver?

来自分类Dev

如何使用Mockito模拟SharedPreferences

来自分类Dev

如何使用Mockito模拟QueueItems []?

来自分类Dev

如何使用 Mockito 模拟 JmsTemplate?

来自分类Dev

如何从不使用Mockito模拟对象来测试异步方法?

来自分类Dev

如何在Mockito中模拟Spring依赖项

来自分类Dev

如何在Mockito中模拟方法参数

来自分类Dev

您如何使用 io 调度程序使用 mockito、rxjava2 测试 spring mvc 中的服务?

来自分类Dev

使用Mockito模拟基类中的方法或模拟静态方法

来自分类Dev

在模拟中存根两个方法使用Mockito和Spring MockMVC引发异常

来自分类Dev

在 Spring 中使用 mockito 测试方法 Controller

来自分类Dev

如何使用Mockito部分模拟抛出异常的方法?

来自分类Dev

如何使用Mockito Junit模拟方法的本地实例

来自分类Dev

如何使用Mockito Junit模拟方法的本地实例

来自分类Dev

如何使用 Mockito 模拟 DynamoDB 映射器 transactionwrite() 方法?

来自分类Dev

如何使用Powermock或Mockito模拟接口数组

来自分类Dev

如何使用Mockito部分模拟HttpServletRequest

来自分类常见问题

如何使用Mockito模拟ExecutorService调用

来自分类Dev

如何使用Mockito模拟上下文?

来自分类Dev

如何使用 mockito 模拟局部变量

来自分类Dev

如何使用 Mockito 模拟 kotlin ByteArray?

来自分类Dev

如何使用 Mockito 正确模拟每个循环?

来自分类Dev

如何使用 mockito 模拟注入对象的属性

来自分类Dev

如何使用 Mockito 模拟 Pageable 对象?

Related 相关文章

  1. 1

    Mockito-在异步方法中模拟正在测试的方法

  2. 2

    如何使用Mockito模拟受保护的方法?

  3. 3

    如何使用ts-mockito模拟方法?

  4. 4

    如何使用 Mockito 模拟列表方法

  5. 5

    如何使用Mockito模拟For循环

  6. 6

    如何使用Mockito模拟WebDriver?

  7. 7

    如何使用Mockito模拟SharedPreferences

  8. 8

    如何使用Mockito模拟QueueItems []?

  9. 9

    如何使用 Mockito 模拟 JmsTemplate?

  10. 10

    如何从不使用Mockito模拟对象来测试异步方法?

  11. 11

    如何在Mockito中模拟Spring依赖项

  12. 12

    如何在Mockito中模拟方法参数

  13. 13

    您如何使用 io 调度程序使用 mockito、rxjava2 测试 spring mvc 中的服务?

  14. 14

    使用Mockito模拟基类中的方法或模拟静态方法

  15. 15

    在模拟中存根两个方法使用Mockito和Spring MockMVC引发异常

  16. 16

    在 Spring 中使用 mockito 测试方法 Controller

  17. 17

    如何使用Mockito部分模拟抛出异常的方法?

  18. 18

    如何使用Mockito Junit模拟方法的本地实例

  19. 19

    如何使用Mockito Junit模拟方法的本地实例

  20. 20

    如何使用 Mockito 模拟 DynamoDB 映射器 transactionwrite() 方法?

  21. 21

    如何使用Powermock或Mockito模拟接口数组

  22. 22

    如何使用Mockito部分模拟HttpServletRequest

  23. 23

    如何使用Mockito模拟ExecutorService调用

  24. 24

    如何使用Mockito模拟上下文?

  25. 25

    如何使用 mockito 模拟局部变量

  26. 26

    如何使用 Mockito 模拟 kotlin ByteArray?

  27. 27

    如何使用 Mockito 正确模拟每个循环?

  28. 28

    如何使用 mockito 模拟注入对象的属性

  29. 29

    如何使用 Mockito 模拟 Pageable 对象?

热门标签

归档