Like unit test this line LayoutInflater.from () in android

Hi, I am creating a simple RecycleView Adapter and trying to test all adapter methods, but onCreateViewHolder was bad for me.

@Override public NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_news,parent,false); return new NewsViewHolder(v); } 

I'm trying to use mockito to create a viewGroup class layout and return the spy from MockContext when getContext () is a call, but that seems to be because I am returning MockContext LayoutInflater.from (), returning a null pointer exception.

This is my test.

  @Test public void testOnCreateViewHolder() throws Exception { ViewGroup vg = mock(ViewGroup.class); MockContext mockContext = new MockContext(); MockContext spyContext = spy(mockContext); when(vg.getContext()).thenReturn(spyContext); NewsViewHolder vh = adapter.onCreateViewHolder(vg, 0); Assert.assertNotNull("Response cant be null",vh); } 

Thanks in advance.

+7
android unit-testing tdd
source share
1 answer

I came across this question when I had the same problem. I decided to solve it myself.

Suppose you have a simple onCreateViewHolder :

 @Override public TeamsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new NewsViewHolder(LayoutInflater .from(parent.getContext()) .inflate(R.layout.fragment_news_view_holder, parent, false) ); } 

Use PowerMock to mock a static instance of LayoutInflater . In the snippet below, I annotated with numbered comments all the steps you need to take to get this to work:

 import android.test.mock.MockContext; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; // 1. signal JUnit to run this test PowerMockRunner @RunWith(PowerMockRunner.class) // 2. signal PowerMock to prepare the static instance of LayoutInflater for testing @PrepareForTest({LayoutInflater.class}) public class NewsRecyclerViewAdapterTest { // 3. LayoutInflater.from(context) returns an inflater, // so we need to mock that one @Mock LayoutInflater mockInflater; @Mock View mockView; @Mock ViewGroup mockParent; private int dummyTestId; private MockContext mockContext; private NewsRecyclerViewAdapter adapter; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); dummyTestId = 0x10000; // 4. mock the static LayoutInflater in "LayoutInflater.from()" // so that we can ask it to return a mockInflater that we moked above mockStatic(LayoutInflater.class); mockContext = new MockContext(); adapter = new NewsRecyclerViewAdapter(Arrays.asList(new NewsItem(), new NewsItem(), new NewsItem())); } @Test public void onCreateViewHolderShouldReturnAValidViewHolder() throws Exception { // 5. mock the context that comes from parent ViewGroup when(mockParent.getContext()).thenReturn(mockContext); // 6. mock the inflater that is returned by LayoutInflater.from() when(LayoutInflater.from(mockContext)).thenReturn(mockInflater); // 7. pass anyInt() as a resource id to care of R.layout.fragment_news_view_holder in onCreateViewHolder() when(mockInflater.inflate(anyInt(), eq(mockParent), eq(false))).thenReturn(mockView); // call onCreateViewHolder() to act NewsViewHolder viewHolder = adapter.onCreateViewHolder(mockParent, dummyTestId); // OKAY straightfoward right? assertNotNull(viewHolder); // this is not very important but I recommend it, // it just returns the view sent to NewsViewHolder // and verify it against the mockView that you inflated above assertEquals(viewHolder.getItemView(), mockView); } } 
+2
source share

All Articles