2015-08-18 14 views
9

Merhaba gerçekten bana yardımcı olabilir umarım, günlerce saçımı çekiyorum gibi hissediyorum.Nasıl android birim test ve statik bir yöntem alay

Ben Yöntem A ı statik yöntem B. ma Bunu daha önce sorulmuş biliyoruz

taklit istiyor statik yöntem B. çağırır, ama Android sahiptir hissediyorum bir yöntem A için birim testleri yazmaya çalışıyorum O zamandan beri olgunlaştı ve test etmek istediğim yöntemleri yeniden yazmadan böyle basit bir iş yapmanın bir yolu olmalı.

public String getUserName(Context context, HelperUtils helper) { 
    if(helper == null){ 
     helper = new HelperUtils(); 
    } 
    int currentUserId = helper.fetchUsernameFromInternet(context); 

    if (currentUserId == 1) { 
     return "Bob"; 
    } else { 
     return "Unknown"; 
    } 
} 

Sonraki Ben taklit istiyor statik yöntem:

Diğer dillerde bu kadar kolay ama sadece ben
public class HelperUtils { 
    public static int fetchUsernameFromInternet(Context context) { 
     int userid = 0; 

     Log.i("HelperUtils ", "hello"); 

     return userid; 
    } 
} 

İşte

Testten istediğim ilk yöntem, bir örnektir Android'de çalışamaz. Ben Mockito denedim ama statik yöntemler

HelperUtils helper = Mockito.mock(HelperUtils.class); 
Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1); 

Bu hatalar

Ben Powermock denedim

org.mockito.exceptions.misusing.MissingMethodInvocationException

desteklenmez ama bu Android tarafından desteklenmektedir tamamen emin değilim görünür. Ben powermock benim gradle dosyasında androidCompile kullanarak çalışan başardı ama bu hatayı alıyorum:

Error:Execution failed for task ':app:dexDebugAndroidTest'. com.android.ide.common.process.ProcessException:

şey döndürmez PowerMockito.mockStatic(HelperUtils.class); cabası, bu yüzden benim GetUserName yöntemine geçmesine bilmiyorum!

Her türlü yardım çok takdir edilecektir.

+0

Uygun bir cevabım yok, ancak kısa bir süre önce bir servis konumlandırıcı modeli ile değiştirerek tekil ve statik sınıflar dolaştım. Kolayca test edilebilir hale getirdi ve her bir sınıfa dönüştürülmesi için birkaç dakika sürdü. – manabreak

+2

Diğer dillerdeki testler hakkında çok şey bilmiyorum ama Java'da 'statik' testin düşmanıdır. –

+0

PowerMock'a (https://github.com/jayway/powermock) bir göz atmak isteyebilirsiniz. Bu zor vakaları test etmenizi sağlayan bir test çerçevesidir. – Micho

cevap

6

Statik yöntemler herhangi bir nesneye ilişkili değildir - senin helper.fetchUsernameFromInternet(...)HelperUtils.fetchUsernameFromInternet(...) aynı (ama biraz kafa karıştırıcı) - hatta nedeniyle bu helper.fetchUsernameFromInternet bir derleyici uyarı almalısınız.

kullanmak zorunda statik yöntemler alay yerine Mockito.mock arasında Dahası: @RunWith(...), @PrepareForTest(...) ve sonra PowerMockito.mockStatic(...) - komple örnek buradadır: Başka bir deyişle PowerMockito mock single static method and return object

- statik yöntemler alay (ve ayrıca kurucular) bir olduğunu biraz zor. Daha iyi bir çözümdür:

  • Eğer HelperUtils değiştirmek bu yöntem statik olmayan olun ve HelperUtils değiştiremiyorsanız şimdi zamanki Mockito.mock

  • ile HelperUtils alay edebilir, bir sarmalayıcı sınıf oluşturmak eğer orijinal HelperUtils hangi delegeler fakat static yöntemleri var ve sonra da Mockito.mock zamanki kullanmaz (bu fikir bazen denir "size ait olmayan değil sahte türlerini yapmak")

İlgili konular