2015-11-20 37 views
7

Hi Am buduję prosty Adapter RecycleView i próbuję przetestować wszystkie metody adaptera, ale onCreateViewHolder jest dla mnie trudny.Jak przetestować tę linię LayoutInflater.from() w Androidzie

@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 Spróbuj użyć Mockito zbudować makiety klasy viewGroup i powrócić szpiega z MockContext gdy getContext() jest wywołanie, ale wydaje się, że ponieważ wracam do MockContext LayoutInflater.from() zwróci wyjątek wskaźnika pustego.

To moja próba

@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); 
} 

góry dzięki.

+1

Czy otrzymałeś na to odpowiedź? – GoCrazy

+1

Brak mojego przyjaciela na końcu firma zdecydowała się przetestować tę funkcjonalność jako test integracji –

Odpowiedz

1

Natknąłem się na to pytanie, gdy miałem ten sam problem. Skończyło się to samo.

Załóżmy, że masz prosty onCreateViewHolder takiego:

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

Zastosowanie PowerMock mock statycznej instancji LayoutInflater. W poniższym fragmencie opatrzono numerami komentarze wszystkie kroki, które należy wykonać, aby to zadziałało:

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); 
    } 

} 
Powiązane problemy