2016-03-02 5 views
1

Это CustomAdapter (кстати: на самом деле старый код, должны быть улучшены некоторые день):EasyMock с Robolectric: EasyMock не работает, как ожидалось

public class CustomAdapter extends BaseAdapter{ 

    private SortedSet<Integer> mHiddenItems = new TreeSet<>();  

    @Override 
    public final int getCount(){ 
     return mHiddenItems.size(); 
    } 

    ... 
} 

Это мой тестовый класс CustomAdapterTest (и все работает хорошо здесь) :

public class CustomAdapterTest extends TestCase{ 

    private static final int ITEMS_IN_ADAPTER = 10; 
    private CustomAdapter mCustomAdapter; 

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

     mCustomAdapter = EasyMock.createMockBuilder(CustomAdapter.class) 
      .addMockedMethod("method1") 
      .addMockedMethod("method2") 
      .createMock(); 

     expect(mCustomAdapter.method2()).andReturn(ITEMS_IN_ADAPTER).anyTimes(); 
    } 

    public void testOne(){ 
     EasyMock.replay(mCustomAdapter); 
     assertEquals(ITEMS_IN_ADAPTER,mCustomAdapter.getTotalCount()); 
     ..... 
    } 

    ...... 

} 

Попытка использовать Robolectric, и после устранения одной ошибки, это как CustomAdapterTest выглядит следующим образом:

@RunWith(RoboelectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class , packageName="my.package.name") 
public class CustomAdapterTest{ 

    private static final int ITEMS_IN_ADAPTER = 10; 
    private CustomAdapter mCustomAdapter; 

    @Before 
    public void setUp(){ 
     System.setProperty("dexmaker.dexcache",RuntimeEnvironment.application.getCacheDir().getPath()) 

     mCustomAdapter = EasyMock.createMockBuilder(CustomAdapter.class) 
      .addMockedMethod("method1") 
      .addMockedMethod("method2") 
      .createMock(); 

     expect(mCustomAdapter.method2()).andReturn(ITEMS_IN_ADAPTER).anyTimes(); 
    } 

    public void testOne(){ 
     EasyMock.replay(mCustomAdapter); 
     assertEquals(ITEMS_IN_ADAPTER,mCustomAdapter.getTotalCount()); 
     ..... 
    } 

    ...... 

} 

Когда я запускаю CustomAdapterTest # testOne() с помощью Robolectric, я не знаю, почему, но mCustomAdapter.mHiddenItems имеет значение null, вызывая NPE при вызове mCustomAdapter.getCount(). Это не происходит в первой версии CustomAdapterTest.

1) Почему при использовании RobolectricGradleTestRunner private SortedSet mHiddenItems = new TreeSet<>(); не выполняется?

2) Как это исправить? Я хочу, чтобы он выполнил private SortedSet mHiddenItems = new TreeSet<>();, как и ожидалось.

ответ

0

Это не точный ответ на ваш вопрос. Но я бы просто переработал тест и класс под тестом.

Я бы удалил частичную насмешку и впрыснул элементы в конструкторе или поверх сеттера. Или я снова буду издеваться над поставщиком товаров в конструкторе.

+0

Это недействительное решение для моего дела (возможно, для других случаев), но спасибо, я ценю ваши усилия по моему вопросу. – JoseF

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