2015-02-16 2 views
2

Я запускаю Robolectric 2.x (2.4) по моему проекту. Я последовал примеру в официальном документе, чтобы создать собственную тень моего собственного класса, но Robolectric его не использует.Создание пользовательских теней с помощью Robolectric 2.X

Проект находится на GitHub(branch roboMockitoTutorial). Вот некоторые фрагменты кода:

Класс, который я пытаюсь создать теневые (AppUtils):

package com.jiahaoliuliu.robolectricsample; 

/** 
* Created by jiahao on 2/15/15. 
*/ 
public class AppUtils { 

    public AppUtils() {} 

    public int generateNumberUsersRandomly() { 
     // :) 
     return 42; 
    } 
} 

Деятельность, где используется класс:

package com.jiahaoliuliu.robolectricsample; 

import android.graphics.Bitmap; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.IOException; 
import java.io.OutputStream; 


public class MainActivity extends ActionBarActivity { 

    TextView my_hello_text_view; 
    Button mClickMeBtn; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AppUtils appUtils = new AppUtils(); 
     System.out.println("The randomly generated number of users is " + appUtils.generateNumberUsersRandomly()); 
     setContentView(R.layout.activity_main); 
     my_hello_text_view = (TextView) findViewById(R.id.my_hello_text_view); 
     mClickMeBtn = (Button) findViewById(R.id.clickMeBtn); 

     int w = 200, h = 200; 
     Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types 
     Bitmap bmp = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap 
     bmp.compress(Bitmap.CompressFormat.PNG, 200, new OutputStream() { 
      @Override 
      public void write(int oneByte) throws IOException { 
       System.out.println("Writting in the outputStream " + oneByte); 
      } 
     }); 
    } 

    public void clickMeBtnPressed(View view) { 
     my_hello_text_view.setText(getString(R.string.ok_thanks)); 
    } 
} 

Тень класса (AppUtilsShadow): класс

package com.jiahaoliuliu.robolectricsample; 

import org.robolectric.annotation.Implementation; 
import org.robolectric.annotation.Implements; 
import org.robolectric.annotation.RealObject; 
import org.robolectric.shadows.ShadowView; 

/** 
* Created by jiahao on 2/15/15. 
*/ 
@Implements(AppUtils.class) 
public class AppUtilsShadow { 

    @RealObject 
    private AppUtils appUtils; 

    public AppUtilsShadow() {} 

    // Trying to create the constructor for it. 
    public void __constructor__() {} 

    @Implementation 
    public int generateNumberUsersRandomly() { 
     System.out.println("Invoking the real object method"); 
     return appUtils.generateNumberUsersRandomly(); 
    } 
} 

тест:

package com.jiahaoliuliu.robolectricsample; 

import com.jiahaoliuliu.robolectricsample.MainActivity; 
import com.jiahaoliuliu.robolectricsample.RobolectricGradleTestRunner; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.Robolectric; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 

import java.util.List; 

import static org.assertj.android.api.Assertions.assertThat; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

@RunWith(RobolectricGradleTestRunner.class) 
@Config(shadows = {AppUtilsShadow.class, MyShadowBitmap.class}) 
public class MyActivityTest { 

    private MainActivity mActivity; 

    @Before 
    public void setup() { 
    mActivity = Robolectric.buildActivity(MainActivity.class).create().get(); 
    } 

    @Test 
    public void testMyActivityAppearsAsExpectedInitially() { 
    assertThat(mActivity.my_hello_text_view).isVisible(); 
    assertThat(mActivity.my_hello_text_view).hasText("Hello world!"); 
    assertThat(mActivity.mClickMeBtn).hasText("Click Me"); 
    } 

} 

ответ

4

Уловка с тенями заключается в том, что они предназначены для затенения классов Android, а не для всех классов. См. documentation или еще лучше, code.

Поскольку AppUtils не из Android SDK, ваша тень не подбирается.

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

Сказанное: если вы действительно хотите использовать тени для этого, вы можете создать собственный тестовый бегун, где вы переопределяете shouldInstrument, чтобы он также отображал классы или пакеты, которые вас интересуют. Затем код, который вы указали выше должно сработать. Я никогда не пробовал это, но вы можете проверить this на какой-нибудь пример кода.

+0

Полезно читать документацию еще раз. Спасибо! –

+0

Спасибо, что поделились ею. Я реализовал его на Robolectric2.4 и 3.0. Кажется, он работает нормально. Код доступен на GitHub: https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java – jiahao

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