jeudi 5 juillet 2018

Junit / robolectric test for RecyclerView

I am done with my RecyclerView and would like to generate a junit_test with a height code coverage. It will be my first junit test, so I would ask you for help. I see there is also a Roboelectric test. Which is better for RecyclerView?

This is my Adapter:

public class SdsORecyclerViewAdapter extends RecyclerView.Adapter<SdsORecyclerViewViewHolder>
{
    private static final ILogger logger = LoggerConfiguration.sdsHistoryOverviewFragment;

    private final ServiceInterface          serviceInterface;
    private final SdsORecyclerViewPresenter presenter;
    /*
        longpress configuration
    */
    private int mExpandedPosition        = -1;
    private int previousExpandedPosition = -1;

    public SdsORecyclerViewAdapter(ServiceInterface serviceInterface,
                                   SdsORecyclerViewPresenter sdsORecyclerViewPresenter)
    {
        this.serviceInterface = serviceInterface;
        this.presenter = sdsORecyclerViewPresenter;
    }

    @Override
    public SdsORecyclerViewViewHolder onCreateViewHolder(final ViewGroup viewGroup, final int viewType)
    {
/*
        creates a new view.
*/
        View sdsoview = LayoutInflater.from(viewGroup.getContext())
                                      .inflate(R.layout.sds_history_conversation_overview_item, viewGroup, false);

        return new SdsORecyclerViewViewHolder(sdsoview, serviceInterface);

    }

    @Override
    public void onBindViewHolder(final SdsORecyclerViewViewHolder sdsoviewholder, final int position)
    {
        presenter.onBindViewHolder(position, sdsoviewholder);
/*
        set contextmenu to visible or gone if @param menuIsExpanded is true or false
*/
        final boolean menuIsExpanded;

        if (position == mExpandedPosition)
        {
            menuIsExpanded = true;
            logger.finest("OPENED " + mExpandedPosition + " SET menuIsExpanded TRUE AD");
        }
        else
        {
            menuIsExpanded = false;
            logger.finest("CLOSED " + position + " OPENED " + mExpandedPosition + " SET menuIsExpanded FALSE AD");
        }
        if (menuIsExpanded)
        {
            sdsoviewholder.getContextMenu().setVisibility(View.VISIBLE);
            logger.finest("VISBLE AD");
        }
        else
        {
            sdsoviewholder.getContextMenu().setVisibility(View.GONE);
            logger.finest("GONE AD");
        }
        sdsoviewholder.itemView.setActivated(menuIsExpanded);

        if (menuIsExpanded)
        {
            previousExpandedPosition = position;
            logger.finest(position + " menuIsExpanded AD");
        }
        logger.finest(String.valueOf(menuIsExpanded) + " VH.");

/*
        longClickListiner for the contextmenu
 */
        sdsoviewholder.itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v)
            {
                if (menuIsExpanded)
                {
                    mExpandedPosition = -1;
                }
                else
                {
                    mExpandedPosition = position;
                }
                notifyItemChanged(previousExpandedPosition);
                notifyItemChanged(position);

                sdsoviewholder.getContextMenu().setSelected(true);
                return true;
            }
        });
    }

    @Override
    public int getItemCount()
    {
        return presenter.getItemCountFromPresenter();
    }
}

This is my ViewHolder

public class SdsORecyclerViewViewHolder extends RecyclerView.ViewHolder
{
    private static final ILogger logger = LoggerConfiguration.sdsHistoryOverviewFragment;
    final ServiceInterface serviceInterface;

/*
    declaration for the ViewHolder
*/

    private TextView  sdsDate;
    private TextView  sdsSsi;
    private TextView  sdsMessage;
    private TextView  sdsLastSender;
    private ImageView sdsImage;
    private ViewGroup contextMenu;

    public SdsORecyclerViewViewHolder(final View sdsoview,
                                      ServiceInterface serviceInterface)
    {
        super(sdsoview);

        this.serviceInterface = serviceInterface;

/*
        if a new SDS is incoming and the SDSO_RecyclerView is opened, then this line is resetting the "newSDS" counter in the MainScreen
        TODO: if an item with a new SDS is opened (first mark the item maybe in red? to show the user this is a new SDS) then reset the "newSDS" counter.
*/
        SdsNewSdsSeenAction sdsNewSdsSeenAction = new SdsNewSdsSeenAction();
        if (serviceInterface != null)
        {
            serviceInterface.sendMessage(sdsNewSdsSeenAction);
        }

/*
        setting up the view (binding the items from the row_list)
*/

        sdsDate = (TextView) sdsoview.findViewById(R.id.sds_item_receiving_date);
        sdsSsi = (TextView) sdsoview.findViewById(R.id.sds_item_ssi);
        sdsMessage = (TextView) sdsoview.findViewById(R.id.sds_item_message_short);
        sdsLastSender = (TextView) sdsoview.findViewById(R.id.sds_item_last_sender);

        sdsImage = (ImageView) sdsoview.findViewById(R.id.sds_history_overview_item_delete_sds);
        contextMenu = (ViewGroup) sdsoview.findViewById(R.id.sds_history_overview_item_menu);
    }

/*
    getter for the presenter
*/

    public TextView getSdsDate()
    {
        return sdsDate;
    }

    public TextView getSdsSsi()
    {
        return sdsSsi;
    }

    public TextView getSdsMessage()
    {
        return sdsMessage;
    }

    public TextView getSdsLastSender()
    {
        return sdsLastSender;
    }

    public ImageView getSdsImage()
    {
        return sdsImage;
    }

    public ViewGroup getContextMenu()
    {
        return contextMenu;
    }
}

This is my presenter

public class SdsORecyclerViewPresenter
{
    private static final ILogger logger = LoggerConfiguration.sdsHistoryOverviewFragment;

    private       List<SdsChatsSqliteViewModel> sdsChatList;
    private final IDataModel                    dataModel;
    private final FragmentSwitcher              fragmentSwitcher;
    private final ServiceInterface              serviceInterface;


    public SdsORecyclerViewPresenter(List<SdsChatsSqliteViewModel> sdsODataset,
                                     FragmentSwitcher fragmentSwitcher,
                                     IDataModel dataModel,
                                     ServiceInterface serviceInterface)
    {
        this.sdsChatList = sdsODataset;
        this.fragmentSwitcher = fragmentSwitcher;
        this.dataModel = dataModel;
        this.serviceInterface = serviceInterface;
    }

/*
        The onBindViewHolder method is setting the items for the RecyclerView from the DataModel
*/
    public void onBindViewHolder(final int position, final SdsORecyclerViewViewHolder sdsoviewholder)
    {


        final SdsChatsSqliteViewModel dataset = sdsChatList.get(position);

        String senderSsi    = dataset.getSenderSsi();
        String recipientSsi = dataset.getRecipientSsi();
        String message      = dataset.getMessage();
        String date         = dataset.getCreatedAt();

//      VIEW IDENTIFICATION
        String recipientName = dataset.getRecipientName();
        String senderName    = dataset.getSenderName();


        final String identifyingSsi = SsiHelper.extractIdentifyingSsi(this.dataModel.getOwnSsi(),
                                                                      senderSsi,
                                                                      recipientSsi);

        String lastMessageFrom;
        if (senderName == null || senderName.isEmpty() || "null".equals(senderName))
            lastMessageFrom = senderSsi;
        else
            lastMessageFrom = senderName;
        String chatName;
        String tmpName;
        if (identifyingSsi.equals(senderSsi))
            tmpName = senderName;
        else
            tmpName = recipientName;

        if (tmpName == null || tmpName.isEmpty() || "null".equals(tmpName))
            chatName = identifyingSsi;
        else
            chatName = tmpName;

        if (logger.isLoggable(Level.FINEST))
        {
            logger.finest("SdsHistoryOverviewListItem created");
        }


        sdsoviewholder.getSdsDate().setText(TimeFormatter.formatTime(date));
        sdsoviewholder.getSdsSsi().setText(chatName);
        sdsoviewholder.getSdsLastSender().setText(lastMessageFrom + ":");
        sdsoviewholder.getSdsMessage().setText(message);

        logger.finest("Element " + position + " set with SSI " + identifyingSsi + " and name " + chatName);


        sdsoviewholder.itemView.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                logger.finest("Element " + position + " clicked.");

/*
        calls getCurrentChat which refers to the ssi set with setCurrentChatSsi
*/
                dataModel.setCurrentChatSsi(identifyingSsi);
                logger.finest("CLICK TO CHAT " + identifyingSsi);
                fragmentSwitcher.showFragment(FragmentSwitcher.SDS_CHAT);

            }
        });

/*
        Deletefunction for SDS_Message
*/

        sdsoviewholder.getSdsImage().setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    sdsoviewholder.getSdsImage()
                                  .setColorFilter(sdsoviewholder.getSdsImage()
                                                                .getResources()
                                                                .getColor(R.color.color_danger));
                }
                else if (event.getAction() == MotionEvent.ACTION_UP)
                {
                    sdsoviewholder.getSdsImage()
                                  .setColorFilter(sdsoviewholder.getSdsImage()
                                                                .getResources()
                                                                .getColor(R.color.color_selection));

                    ButtonAction deleteConvAction = new ButtonAction(ButtonCode.DELETE_CHAT,
                                                                     ButtonEventType.RELEASE,
                                                                     identifyingSsi);
                    logger.finest(identifyingSsi + " deleted");
                    serviceInterface.sendMessage(deleteConvAction);
                }
                return true;
            }
        });

    }

    public int getItemCountFromPresenter()
    {
        return sdsChatList.size();
    }
}

Thank you very much

Aucun commentaire:

Enregistrer un commentaire