2017-02-02 3 views
1

У меня есть код, где используется библиотека Пикассо.Как насмехаться над Picasso в модульных тестах на Android?

@Inject 
public RegistrationPresenter(UserData userData, Picasso picasso) { 
    this.userData = userData; 
    this.picasso = picasso; 
} 

@Override 
public void attachView(RegistrationView view) { 
    super.attachView(view); 
    view.toggleKeyboardButton(false); 
    view.showFirstName(userData.getFirstName()); 
    view.showLastName(userData.getLastName()); 
    view.showEmail(userData.getEmail()); 
    setImage(); 
} 

private void setImage() { 
    String url = String.format(IMAGE_URL, userData.getId()); 
    String tag = String.format(JPG_EXT, userData.getId()); 
    picasso 
      .load(url) 
      .tag(tag) 
      .into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        //some actions 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 
       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 
       } 

      }); 
} 

В моей предъявитель я обеспечиваю Picasso через Dagger2

@Provides 
@Singleton 
Picasso providesPicasso() { 
    return Picasso.with(context); 
} 

В моих тестах я использую Robolectric и Mockito, так что я издеваться Пикассо и передать его в конструктор презентатора

@Mock 
Picasso picasso; 

@Before 
public void setUp() { 
    super.setUp(); 
    MockitoAnnotations.initMocks(this); 
    mockData = new UserData(); 
    mockData.setFirstName("Name"); 
    mockData.setLastName("LastName"); 
    mockData.setEmail("[email protected]"); 
    mockData.setId("123456"); 

    File mockCacheDir = mock(File.class); 
    Context mockAppContext = mock(Context.class); 
    when(mockContext.getApplicationContext()).thenReturn(mockAppContext); 
    when(mockContext.getApplicationContext().getCacheDir()).thenReturn(mockCacheDir); 
    when(view.getContext()).thenReturn(mockContext); 
    presenter = new RegistrationPresenter(mockData, picasso); 
} 

@Test 
public void testAttachView() { 
    presenter.attachView(view); //fails here 
    verify(view).toggleKeyboardButton(false); 
    verify(view).showFirstName(mockData.getFirstName()); 
    verify(view).showLastName(mockData.getLastName()); 
    verify(view).showEmail(mockData.getEmail()); 
} 

Когда я запускаю свой тест, он не работает с исключением

java.lang.NullPointerException 
at com.squareup.picasso.Utils.createDefaultCacheDir(Utils.java:257) 
at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:45) 
at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.java:424) 
at com.squareup.picasso.Utils.createDefaultDownloader(Utils.java:250) 
at com.squareup.picasso.Picasso$Builder.build(Picasso.java:832) 
at com.squareup.picasso.Picasso.with(Picasso.java:662) 

Каков правильный способ издеваться над Пикассо?

+0

Не могли бы вы показать нам единичный тест, который терпит неудачу? Не видя этого, я подозреваю, что проблема в том, что вы никогда не устанавливали никакого поведения для вашего «Пикассо». Mocks не использует реальные методы издевающегося класса, поэтому они просто возвращают null по умолчанию. – Pox

+0

@Pox спасибо, обновлено – user2806449

ответ

1

Don't mock File. Скорее всего, ваш тест терпит неудачу, так как требуется реальная реализация File. Вместо этого используйте правило TemporaryFolder:

@Rule 
public TemporaryFolder folder = new TemporaryFolder(); 

@Before 
public void setUp() { 
    // ... 
    when(mockContext.getApplicationContext().getCacheDir()).thenReturn(folder.newFolder())); 
    // ... 
} 
+0

Теперь он терпит неудачу с NPE здесь 'picasso .load (url) .tag (tag)' – user2806449

+1

Можете ли вы создать новый вопрос о Stackoverflow для нового NPE, пожалуйста. Это облегчает для всех возможность сосредоточиться на этой конкретной проблеме. –

Смежные вопросы