Vertx 使用 Handler<AsyncResult<>> 参数模拟异步方法

Vah*_*ini 5 testing mocking mockito vert.x

我有这个数据访问接口:

public interface UserDao {

   void loadUsers(Handler<AsyncResult<List<User>>> handler);

}
Run Code Online (Sandbox Code Playgroud)

它用于这样的服务:

public class UserService {

  private UserDao userDao;

  public UserService(UserDao UserDao) {
    this.userDao = userDao;
  }

  public void getUsers(Future<List<User>> future) {
    userDao.loadUsers( ar ->{
      if (ar.succeeded()){
        List<User> users = ar.result();
        // process users
        future.complete(users);
      }else {
        // handle the error
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我的目的是对我的服务进行单元测试并模拟数据访问层。每次调用 UserDao 类的 getUsers 方法时,我都想返回一组固定的结果。

@Test
public void testGetUsers(TestContext context) {

  Async async = context.async();

  UserDao mockUserDao = Mockito.mock(UserDao.class);

  UserService userService = new UserService(mockUserDao);
  List<User> mockResult = Arrays.asList(new User(), new User());

  /* (?) How to make mockUserDao return mockResult through its Handler argument? */

  Future<List<User>> future = Future.future();
  userService.getUsers(future);
  future.setHandler(ar -> {
    assertEquals(2, ar.result().size());
    async.complete();
  });

  async.awaitSuccess();

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?它不适合正常的 Mockito 模式when( serviceMock.method (any(Argument.class))).thenAnswer(new Result())因为mockResult不是从方法中返回,而是通过处理程序返回。

Yog*_*dke 0

Handler也。

Handler mockedHandler = mock(Handler.class);
when(mockedHandler.result()).thenReturn(mockResult);
when(userDao.loadUsers(any(Handler.class))).thenReturn(mockedHandler);
Run Code Online (Sandbox Code Playgroud)