Макет статического метода с контекстом в качестве параметра с помощью PowerMockito

У меня есть класс со статическим методом

public class GrandUtils {
 
    /**
     * Return list of existing user's emails
     *
     * @param c context of the app
     * @return list of existing accounts in system or empty list
     */
    public static Set<String> getAccountsList(Context c) {
        Set<String> accountsList = new HashSet<>();
        Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
        Account[] accounts = AccountManager.get(c).getAccounts();
        for (Account account : accounts) {
            if (emailPattern.matcher(account.name).matches()) {
                accountsList.add(account.name);
            }
        }
        return accountsList;
    }
}

Кроме того, я реализовал сложную службу IntentService, которая вызывает GrandUtils.getAccountList(Context c) и сохраняет эти учетные записи в SharedPreferences. Итак, я хочу имитировать метод с моим собственным набором писем, а затем проверить результат, сохраненный в SharedPreferences

Итак, я написал этот тест

    @RunWith(MockitoJUnitRunner.class)
    @PrepareForTest(GrandUtils.class)
    public class CampaingTrackingTest extends ApplicationTestCase<Application> {
        
            public CampaingTrackingTest() {
                super(Application.class);
            }
        
            @Override
            @Before
            public void setUp() throws Exception {
                super.setUp();
                System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
                createApplication();
            }
        
            @MediumTest
            public void testMockAccounts() {
                HashSet<String> mails = new HashSet<>();
                mails.add("[email protected]");
                //it needs Context
PowerMockito.when(GrandUtils.getAccountsList(getContext())).thenReturn(mails);
        
                Set<String> givenMails = GrandUtils.getAccountsList(getContext());
                assertNotNull(givenMails);
                assertEquals(givenMails.size(), 1);
        
                // Next part for comparing data with IntentService and SharedPreferences
            }
        }

но это не срабатывает с

org.mockito.exceptions.misusing.MissingMethodInvocationException: when () требует аргумента, который должен быть «вызовом метода на имитации». Например: когда (mock.getArticles ()). ThenReturn (статьи);

Кроме того, эта ошибка может появиться из-за того, что:

  1. вы используете один из методов: final / private / equals () / hashCode (). Эти методы не могут быть заглушены / проверены. Методы имитации, объявленные для закрытых родительских классов, не поддерживаются.

  2. внутри when () вы вызываете метод не на макете, а на каком-то другом объекте.

Я уверен, что что-то делаю не так, но что?


person AndriiGenesis    schedule 13.05.2015    source источник


Ответы (1)


См. Этот пример PowerMock для имитации статического метода Log.d(String tag, String message):

https://github.com/mttkay/droid-fu/blob/master/src/test/java/com/github/droidfu/TestBase.java.

Думаю, это хороший пример работы со статическими методами.

person Daniel Zolnai    schedule 13.05.2015