【问题标题】:Mockito Test: verify static method was called inside fragmentMockito Test:验证在片段内部调用了静态方法
【发布时间】:2016-06-22 10:32:19
【问题描述】:

我有一个片段,它调用另一个 Util 类的静态方法。

 public class DummyFragment extends Fragment {

    public void dummyMethodCall(){
      UtilClass.dummyStaticMethod(Arg arg);
    }

 }

如何验证 UtilClass.dummyStaticMethod() 是否已在使用 PowerMockito 的 Mockito 测试中被调用?以下是我当前的测试:

    @RunWith(RobolectricGradleTestRunner.class)
    @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
    @Config(constants = BuildConfig.class, sdk = 19, packageName = "com.dummy.package", application = DummyApplication.class)
    @PrepareForTest({UtilClass.class})
    public class FragmentTest {

    private DummyFragment mDummyFragment;

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    @Before
    public void setUp() {
        mDummyFragment = new DummyFragment();
    }

    @Test
        public void dummyMethodCall_success() {

            PowerMockito.mockStatic(UtilClass.class);
            mDummyFragment.dummyStaticMethod();
            PowerMockito.verifyStatic();
        }

    }

错误日志:

java.lang.IllegalStateException: Failed to transform class with name android.app.Activity. Reason: android.app.LoaderManagerImpl

at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:267)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:70)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at javassist.runtime.Desc.getClassObject(Desc.java:43)
at javassist.runtime.Desc.getClassType(Desc.java:152)
at javassist.runtime.Desc.getType(Desc.java:122)
at javassist.runtime.Desc.getType(Desc.java:78)
at com.dummy.package.DummyFragmentTest.setUp(DummyFragment.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)

【问题讨论】:

    标签: android mockito powermockito


    【解决方案1】:

    如果您想检查它在实际测试中是否被调用,可以将布尔静态成员添加到您在 dummyStaticMethod() 中设置为 true 的 UtilClass,然后在测试中进行调用后检查该值。

    如果您只是为了调试目的而检查它,您可以在调试模式下运行并在 dummyStaticMethod 中设置断点,或者在方法中添加 System.out.print。

    【讨论】:

    • 感谢您的回答。不幸的是,调用静态方法导致测试崩溃,因为我可能没有正确使用 PowerMockito。所以我不能遵循第一种方法:(
    • 当您说它崩溃时,是否与您的问题中的日志相同?如果是这样,看起来问题出在您的设置中,在 DummyFragment 的第 60 行。还是调用静态方法时出现新的崩溃?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多