У меня есть класс со статическим методом
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 (статьи);
Кроме того, эта ошибка может появиться из-за того, что:
вы используете один из методов: final / private / equals () / hashCode (). Эти методы не могут быть заглушены / проверены. Методы имитации, объявленные для закрытых родительских классов, не поддерживаются.
внутри when () вы вызываете метод не на макете, а на каком-то другом объекте.
Я уверен, что что-то делаю не так, но что?