当前位置: 首页 > 知识库问答 >
问题:

使用PowerMockito的以上下文为参数的模拟静态方法

何勇
2023-03-14
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;
    }
}
    @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
            }
        }

在when()中,您不是在mock上调用method,而是在其他对象上调用method。

我肯定我做错了什么,但什么?

共有1个答案

东方宜
2023-03-14

有关静态方法log.d(String tag,String message)的模拟,请参见此PowerMock示例:

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

我认为它为处理静态方法提供了一个很好的例子。

 类似资料:
  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 在尝试模拟InetAddress中的静态方法时,我遇到了奇怪的问题。我成功地能够为许多其他类模拟静态方法,并且一切正常,但InetAddress显示不同的行为。我使用的是JUnit 4. x、Mockito 1.9.5 下面给出了使用Mockito和PowerMock以及InetAddress模拟的测试- 当我将下面给出的方法放入某个实用程序InetAddress中时。getLocalHost()

  • 编辑: 感谢所有的回复。我找到了解决办法。我试图模拟一个方法findById,它不是直接在User.class中,而是在用户扩展的genericModel.class中。现在一切都很完美。

  • 当所有参数都在使用匹配器时,为什么我会得到这个异常?如何解决?我调试了它,发现返回null。 当我将注释添加到测试类并运行测试时,junit不会做出响应。为什么? 编辑 我试着不使用论据匹配器,结果

  • 有没有办法用参数模拟静态方法。 我看到了很多关于这个问题的问题,但是我找不到任何与之相关的问题。