2014-02-01 2 views
4

Для моего приложения для Android мне нужно несколько процедур обработки изображений, которые я хочу протестировать с помощью robolectric. Эти процедуры работают на объектах Bitmap. Для этого мне нужно загрузить тестовые изображения. К моему большому разочарованию я обнаружил, что robolectric не поддерживает фреймворк Android класса BitmapFactory. Они говорят:Тестирование процедур обработки изображений с robolectric

Robolectric isn't here to run your entire application on the JVM, it's just here to enable enough functionality exists so that you can test your code.

Так что я решил написать свой собственный Bitmap погрузчик:

public static Bitmap loadFromFile(File file) throws IOException 
{ 
    final BufferedImage image = ImageIO.read(file); 
    final int[] pixels = new int[ image.getWidth() * image.getHeight() ]; 

    image.getRGB 
     (0     // start x 
     , 0     // start y 
     , image.getWidth()  // width 
     , image.getHeight() // height 
     , pixels    // pixel array 
     , 0     // offset 
     , image.getWidth()); // stride 

    final Bitmap result = Bitmap.createBitmap 
     (pixels      // pixel array 
     , image.getWidth()   // width 
     , image.getHeight()   // height 
     , Bitmap.Config.ARGB_8888); // format 

    return result; 
} 

Я также хотел, чтобы проверить, работает ли загрузчик, так что я написал короткую процедуру тестирования показано ниже.

@Test 
public void test() throws Exception 
{ 
    final Bitmap source = loadFromFile(new File("in.png")); 
    saveToFile(source, "png", new File("out.png")); 
} 

Он использует следующую процедуру для записи изображения:

public static void saveToFile 
    (Bitmap bitmap 
    , String format, File file) throws IOException 
{ 
    final BufferedImage image = new BufferedImage 
     (bitmap.getWidth()    // width 
     , bitmap.getHeight()    // height 
     , BufferedImage.TYPE_INT_ARGB); // channels 

    final int[] pixels = new int[ image.getWidth() * image.getHeight() ]; 

    bitmap.getPixels 
     (pixels    // pixel array 
     , 0      // offset 
     , image.getWidth()  // stride 
     , 0      // start x 
     , 0      // start y 
     , image.getWidth()  // width 
     , image.getHeight()); // height 

    image.setRGB 
     (0     // start x 
     , 0     // start y 
     , image.getWidth()  // width 
     , image.getHeight() // height 
     , pixels    // pixel array 
     , 0     // offset 
     , image.getWidth()); // stride 

    ImageIO.write(image, format, file); 
} 

После того как я запустить тест, я сравниваю письменный out.png к in.png. Хотя, конечно, in.png выглядит хорошо, out.png пуст. Он имеет правильные размеры, но заполняется нулевыми альфа-пикселями.

Вопрос: Что я делаю неправильно? Как я могу загрузить тестовые изображения с помощью robolectric, которые мне требуются для тестирования моих процедур обработки изображений?

Примечание: Если установить все pixels записи в 0xFFFFFFFF прямо перед созданием Bitmap объекта, ничего не меняется. Письменное изображение остается прозрачным. Поэтому я думаю, что ошибка должна быть где-то позже.

Я использую robolectric 2.2.

+0

Любые обновления на этом компьютере? Я пробовал много подходов, но похоже, что Bitmap заштрихован ... – saikek

+0

@saikek Нет, похоже, что только вы можете сделать это, используя собственную абстракцию «Bitmap», которая использует исходную «битмап», когда она доступна, и падает вернуться к собственной реализации в противном случае. – theV0ID

ответ

2

Ну, видимо, я закончил эту проблему, выполнив обычные тесты на Android. Пример:

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.test.ActivityInstrumentationTestCase2; 
import android.test.UiThreadTest; 

public class InvadersFromSpace extends ActivityInstrumentationTestCase2<ColorPickerActivity> { 

    public InvadersFromSpace() { 
     super(ColorPickerActivity.class); 
    } 

    ColorPickerActivity mainActivity; 
    Bitmap forpixels; 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 

     mainActivity = getActivity(); 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inScaled = false; 
     forpixels = BitmapFactory.decodeFile("/storage/sdcard0/photos/IMG_20130815_194838.jpg"); 
    } 

    @UiThreadTest 
    public void testImageNormallyLoaded() { 
     assertTrue(forpixels.getWidth() == 1716); 
     assertTrue(forpixels.getHeight() == 1709); 
    } 

    @UiThreadTest 
    public void testFlagDarkBlue() { 
     CompareFewColors(forpixels, 772, 690, new String[]{"DarkMidnightBlue","Charcoal","CoolBlack"}, true); 
     CompareFewColors(forpixels, 991, 1269, new String[]{"Arsenic","DarkMidnightBlue","Charcoal"}, false); 
    } 
} 

Так 2 точки, которые вы должны принять во внимание: 1) Расширение ActivityInstrumentationTestCase2 2) Запуск теста с @UiThreadTest атрибутом. (в противном случае при доступе к параметрам ui или растровым изображениям у них есть заглушки/mocks/старые параметры)

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