2017-02-02 8 views
1

私はピカソのライブラリが使われているコードを持っています。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) { 
       } 

      }); 
} 

は私のプレゼンターに私は私がRobolectricとMockitoを使用しています私のテストで

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

Dagger2

経由ピカソ提供し、私はピカソを模擬し、プレゼンターのコンストラクタに渡し

@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

私たちはユニットテストに失敗したことを教えてください。 それを見ることなく、あなたはあなたの 'ピカソ'モックのための行動を決して決してしないことが問題だと思うでしょう。モックは模擬クラスの実際のメソッドを使用しないので、デフォルトで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

新しいNPEの新しいStackoverflow質問を作成できますか?これにより、誰もがその特定の問題に集中するのが容易になります。 –

関連する問題