【发布时间】:2014-09-14 21:59:49
【问题描述】:
我正在尝试测试当我执行 HomePresenter 类的方法“onCreate(IHomeView iHomeView)”时是否调用了“setTabs()”。 “SetTabs()”是IHomeView中的一个接口方法。为了测试它,我使用了 mockito,但是当我调用 homeView.setTabs() 时我得到了一个非法的ArgumentException
我把我的代码放在这里,很简单:
我的简单测试:
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.robolectric.util.FragmentTestUtil.startFragment;
@RunWith(RobolectricTestRunner.class)
public class HomeFragmentTest {
@Test
public void testOnCreateHomePresenter() {
IHomeView homeViewMock = mock(IHomeView.class);
HomePresenter homePresenter = new HomePresenter();
homePresenter.onCreate(homeViewMock);
verify(homeViewMock, times(1)).setTabs();
}
}
IHomeView.class
public interface IHomeView {
public void setTabs();
}
HomePresenter.java
public class HomePresenter implements IHomePresenter {
private IHomeView mHomeView;
public void onCreate(IHomeView homeView) {
mHomeView = homeView;
mHomeView.setTabs();
}
}
HomeFragment --> 实现 IHomeView
public class HomeFragment extends RoboFragment implements IHomeView {
@Inject
HomePresenter mHomePresenter;
@InjectView(R.id.tv1)
TextView textView;
@InjectView(R.id.progessbar)
SmoothProgressBar progressBar;
@InjectView(R.id.pager)
private ViewPager mViewPager;
@InjectView(R.id.tabs)
private PagerSlidingTabStrip tabs;
private TabAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container,
false);
if (rootView == null)
throw new IllegalStateException("Can't inflate the view");
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Logger.logWarning("=>onViewCreated()");
progressBar.setProgressiveStartActivated(true);
mHomePresenter.onCreate(this);
}
@Override
public void setTabs() {
mAdapter = new TabAdapter(getChildFragmentManager(), getResources());
mViewPager.setAdapter(mAdapter);
int marginBetweenPages = getMarginBetweenPages();
mViewPager.setPageMargin(marginBetweenPages);
tabs.setViewPager(mViewPager);
}
}
build.gradle 中的依赖项
compile 'com.android.support:appcompat-v7:20.0.+'
compile 'com.android.support:support-v4:20.+'
compile 'com.crashlytics.android:crashlytics:1.+'
compile 'net.hockeyapp.android:HockeySDK:3.0.2'
compile 'com.squareup.retrofit:retrofit:1.6.1'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.github.castorflex.smoothprogressbar:library:0.5.2'
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
compile 'net.hockeyapp.android:HockeySDK:3.0.2'
compile('org.roboguice:roboguice:3.0-alpha-2') {
exclude module: 'asm'
}
compile('fr.avianey:facebook-android-api:+@aar') {
exclude group: 'com.google.android', module: 'support-v4'
}
// ================== TESTING LIBRARIES ======================
androidTestCompile 'junit:junit:4.10'
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'com.squareup:fest-android:1.0.+'
androidTestCompile 'org.bouncycastle:bcprov-jdk15on:1.50'
androidTestCompile 'com.jakewharton:butterknife:5.1.0'
androidTestCompile 'org.mockito:mockito-core:1.9.5'
androidTestCompile 'com.google.dexmaker:dexmaker:1.0'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'
另外,我尝试注释 setTabs() 中的所有方法,但它不起作用。我正在使用 Mockito 1.9.5 和 Robolectric 2.3。我使用的是 Android Studio 0.8.1,运行测试的命令是:
./gradlew test
我认为,测试很简单,但我没有让它工作。 有人可以说我做错了什么吗?
我还包括 gradle 输出:
java.lang.IllegalArgumentException
at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49)
at com.sun.proxy.$Proxy31.setTabs(Unknown Source)
at com.peerade.ave.presenters.HomePresenter.onCreate(HomePresenter.java:24)
at com.peerade.ave.tests.HomeFragmentTest.testOnCreateHomePresenter(HomeFragmentTest.java:56)
Gradle 测试执行器 1 已完成执行测试。
非常感谢!
已修复!
如果您从 androidTestCompile 中删除 dexmaker 和 dexmaker-mockito,它将像一个魅力一样工作。我在这里找到了解决方案:https://code.google.com/p/dexmaker/issues/detail?id=4
【问题讨论】:
-
您的测试代码似乎正确。您能否发布您的测试类的“导入”部分以及您收到的错误消息?
-
我只包含更多信息@ManuelFranco。
-
发生这种情况时您是否使用了 ART?我有一个类似的例外,但只是删除 dexmaker 和 dexmaker-mockito 并没有解决它,它会产生其他问题。我可以删除 dexmaker 并且仍然有相同的错误,但是没有 dexmaker-mockito 我会遇到更多问题。这里有更多背景:github.com/mockito/mockito/issues/71
-
我使用 robolectric 和 Android Studio 0.8.6 来测试我的应用程序。我不在真实设备上运行我的测试。如果您想使用真实设备运行测试,请尝试 Espresso。这里 (github.com/robolectric/deckard-gradle) 是一个很好的开始模板。您可以下载他的项目,添加 mockito 依赖项并检查您的项目是否编译。
标签: android unit-testing testing mockito