### Question:
DefaultItemAnimator extends SimpleItemAnimator { @Override public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { final View view = holder.itemView; fromX += (int) holder.itemView.getTranslationX(); fromY += (int) holder.itemView.getTranslationY(); resetAnimation(holder); int deltaX = toX - fromX; int deltaY = toY - fromY; if (deltaX == 0 && deltaY == 0) { dispatchMoveFinished(holder); return false; } if (deltaX != 0) { view.setTranslationX(-deltaX); } if (deltaY != 0) { view.setTranslationY(-deltaY); } mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY)); return true; }  @Override void runPendingAnimations(); @Override boolean animateRemove(final RecyclerView.ViewHolder holder); @Override boolean animateAdd(final RecyclerView.ViewHolder holder); @Override boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY,
            int toX, int toY); @Override boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder,
            int fromX, int fromY, int toX, int toY); @Override void endAnimation(RecyclerView.ViewHolder item); @Override boolean isRunning(); @Override void endAnimations(); @Override boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,
            @NonNull List<Object> payloads);  }### Answer:
@Test public void animateMove() throws Throwable { ViewHolder vh = createViewHolder(1); expectItems(vh); assertTrue(animateMove(vh, 0, 0, 100, 100)); assertTrue(mAnimator.isRunning()); runAndWait(1, 1); }
@Test public void cancelMoveBefore() throws Throwable { ViewHolder vh = createViewHolder(1); expectItems(vh); assertTrue(animateMove(vh, 10, 10, 100, 100)); cancelBefore(1, vh); }
@Test public void cancelMoveAfter() throws Throwable { ViewHolder vh = createViewHolder(1); expectItems(vh); assertTrue(animateMove(vh, 10, 10, 100, 100)); cancelAfter(1, vh); }