2015-08-10 10 views
7

Muszę wyśmiać klasę niestandardową (utwórz dla niej cień). Przeczytałem już na http://robolectric.org/custom-shadows/ jak to zrobić.Jak tworzyć niestandardowe cienie w Robolectric 3.0?

tak, mam klasę:

public class MyClass { 

    public static int regularMethod() { return 1; } 
} 

utworzyć cień:

@Implements(MyClass.class) 
public class MyShadowClass { 

    @Implementation 
    public static int regularMethod() { return 2; } 
} 

I ustawić cień w teście klasy:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, shadows={MyShadowClass.class}) 
public class MyTest { 

    @Test 
    public void testShadow() { 
     assertEquals(2, MyClass.regularMethod()); 
    } 
} 

ale cień nie jest używany.

java.lang.AssertionError: 
Expected :2 
Actual :1 

Jak zrobić cień niestandardowy widoczny dla RobolectricGradleTestRunner?

Próbowałem już:

  1. http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
  2. https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
  3. Mock native method with a Robolectric Custom shadow class

ale ja się różne błędy kompilacji, takich jak

  • InstrumentingClassLoaderConfig Nie znaleziono
  • Setup Nie znaleziono

jak prawidłowo używać własnych cieni w robolectric 3,0?

+0

Zazwyczaj owijamy statyczne metody we własne klasy lub chronione metody, które możemy wysmakować w testach –

Odpowiedz

4

Należy unikać niestandardowych cieni i musi to być ostatni dołek. Powinno być używane tylko wtedy, gdy nie możesz zrobić wiele refaktoryzacji w swoim kodzie, co uniemożliwia wykonywanie testów jak natywne wywołanie metody. Lepiej kpić z obiektu tej klasy lub szpiega za pomocą powermock lub mockito niż niestandardowy cień. Jeśli jest to metoda statyczna, użyj powermock.

W naszym projekcie mieliśmy klasę, która miała pewne metody natywne i była klasą config używaną wszędzie w aplikacji. Przenieśliśmy więc metody natywne do innej klasy i zasłoniliśmy to. Te natywne metody zawodziły przypadki testowe.

Anyways oto jak można zwyczaj cień w robolectric 3,0:

Tworzenie biegacza zwyczaj testową, która rozciąga RobolectricGradleTestRunner:

public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner { 


public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError { 
    super(klass); 
} 

public InstrumentationConfiguration createClassLoaderConfig() { 
    InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); 
    builder.addInstrumentedPackage("com.yourClassPackage"); 
    return builder.build(); 
} 

Upewnij się, że pakiet nie zawiera żadnych przypadków testowych, które działają przy użyciu robolectric.

1

Jestem Jiahao, twórcą drugiego repozytorium, do którego się odwołujesz.

Przede wszystkim dzięki za sprawdzenie kodu. Wykonuję wiele badań na Androida i cieszę się, że moje badania są przydatne dla kogoś innego.

Następnie, Cień o Robolectric. Używam Robolectric 3.1 w tym projekcie, aby sprawdzić, jak Robolectric 3 współpracuje z prawoślazu: https://github.com/jiahaoliuliu/robolectricForMarshmallow

I zostały testowanie nowego Runtime Permission Menedżer, jak również shadowing stosowania i działania.

Oto przykładowy kod aktywności zas:

import android.content.Context; 
import com.jiahaoliuliu.robolectricformarshmallow.controller.MainController; 
import org.robolectric.annotation.Implementation; 
import org.robolectric.annotation.Implements; 

/** 
* Created by Jiahao on 7/18/16. 
*/ 
@Implements(MainController.class) 
public class MainControllerShadow { 

    public void __constructor__ (Context context) { 
     // Not do anything 
    } 

    @Implementation 
    public String getTextToDisplay(boolean permissionGranted) { 
     return "Test"; 
    } 
} 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/shadow/MainControllerShadow.java

I tak używam go w badanej jednostki:

pakiet com.jiahaoliuliu.robolectricformarshmallow;

import com.jiahaoliuliu.robolectricformarshmallow.shadow.MainControllerShadow; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.Robolectric; 
import org.robolectric.RobolectricGradleTestRunner; 
import org.robolectric.annotation.Config; 

import static org.junit.Assert.*; 

/** 
* Created by Jiahao on 6/30/16. 
*/ 
@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, manifest = Config.NONE, application = FoolApplication.class, 
    shadows = { MainControllerShadow.class}, sdk = 18) 
public class MainActivityTest { 

    private MainActivity mMainActivity; 

    @Before 
    public void setUp() throws Exception { 
     mMainActivity = Robolectric.setupActivity(MainActivity.class); 
    } 

    @After 
    public void tearDown() throws Exception { 

    } 

    @Test 
    public void testOnCreate() throws Exception { 
     // Simple test to know that it works 
     assertTrue(true); 
    } 
} 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/MainActivityTest.java

Jak widać, nie używam dostosowanych Gradle testową Runner. Sprawdziłem kod źródłowy programu Robolectric, dla wersji 3.0 i 3.1 (najnowszy) wystarczy tylko określić klasy cienia w nagłówku.

Mam nadzieję, że pomaga

Powiązane problemy