2015-11-20 12 views
7

Ciao Sto costruendo un semplice adattatore RecycleView e sto provando a testare tutti i metodi dell'adattatore ma l'onCreateViewHolder è stato difficile per me.Come testare questa linea di LayoutInflater.from() in Android

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

ho provare a utilizzare Mockito per costruire un modello della classe viewGroup e restituire una spia del MockContext quando getContext() è chiamata ma sembra essere che perché sto tornando un MockContext LayoutInflater.from() restituisce un eccezione del puntatore nullo.

Questa è la mia prova

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

Grazie in anticipo.

+1

Hai una risposta per questo? – GoCrazy

+1

Nessun mio amico alla fine la società ha deciso di testare questa funzionalità come test di integrazione –

risposta

1

Mi sono imbattuto in questa domanda quando ero lo stesso problema. Ho finito per risolverlo da solo.

Si supponga di avere una semplice onCreateViewHolder come questo:

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

Usa PowerMock per deridere l'istanza statica di LayoutInflater. Nello snippet seguente, ho annotato utilizzando i commenti numerati tutti i passaggi che devi compiere per fare in modo che questo funzioni:

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

} 
Problemi correlati