我有静态方法的类
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;
}
}
此外,我已经实施了复杂的意图服务,该意见正在调用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("one@one.com");
//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.missingmethodinvocation exception:当()需要一个必须是"模拟方法的方法"的参数。例如:何时(Mock.getArticles())。thenturn(文章);
另外,此错误可能出现是因为:
您存根以下是:final/private/equals()/hashcode()方法。这些方法不能被固定/验证。声明的模拟方法在非公共父母类中不支持。
内部()当()您不在模拟上调用方法,而是在某些其他对象上。
我敢肯定我做错了什么,但是什么?
请参阅静态方法的模拟示例Log.d(String tag, String message)
:
https://github.com/mttkay/droid-fu/blob/master/src/src/test/java/java/com/com/github/droidfu/testbase.java
我认为这为处理静态方法提供了一个很好的例子。