Articles of mockito

将powermock添加到android测试项目时,apkbuilder会find重复的文件

我正在尝试将powermock–mockito和mockito添加到Android Test项目中。 我使用android命令行工具创建了android测试项目来创建build.xml和项目结构。 我的libs /目录中有以下jar: dexmaker-1.0.jar dexmaker-的Mockito-1.0.jar 的Mockito-ALL-1.9.5.jar powermock-的Mockito-1.5-full.jar 当我尝试使用ant debug构建项目时,我收到以下错误: [apkbuilder] Creating ProjectTests-debug-unaligned.apk and signing it with a debug key… [apkbuilder] Found duplicate file for APK: mockito-extensions/org.mockito.plugins.MockMaker [apkbuilder] Origin 1: /home/cmiller/Projects/android-project/ProjectTests/libs/powermock-mockito-1.5-full.jar [apkbuilder] Origin 2: /home/cmiller/Projects/android-project/ProjectTests/libs/powermock-mockito-1.5-full.jar BUILD FAILED /home/cmiller/Applications/adt-bundle-linux/sdk/tools/ant/build.xml:951: The following error occurred while executing this line: /home/cmiller/Applications/adt-bundle-linux/sdk/tools/ant/build.xml:962: The following error occurred while executing this […]

在unit testing中模拟注入的字段

我有一个Presenter类,它使用通过Dagger注入的字段,它看起来像这样: public class RssListPresenter { @Inject RssService rssService; // <– injected field public RssListPresenter() { setupDI(); } private void setupDI() { DaggerNetworkComponent.builder() .networkModule(new NetworkModule()) .build() .inject(this); } public void loadItems() { Rss rss = rssService.getRssFeed() // …. } } 一切正常。 现在,我想对RssListPresenter类进行unit testing。 问题是我如何向演示者提供模拟RssService ? 当然,我可以向演示者添加一个新方法setRssService(RssService rssService)并使用它来提供unit testing的模拟,但是仅仅为unit testing添加此方法感觉不对。 处理这个问题的正确方法是什么? 为了完整性,这里是模块和组件声明: @Singleton @Component(modules = NetworkModule.class) public […]

运行时错误PowerMock + Mockito:ProxyFrameworkImpl无法位于类路径中

我试图将PowerMock与Android InstrumentTestCase一起使用由于我的测试在Android设备上运行,因此需要将库添加到apk中。 我遇到了powermock + mockito和Dex文件的大问题。 我的依赖项中只有powermock + mockito的运行时错误: org.powermock.api.extension.proxyframework.ProxyFrameworkImpl could not be located in classpath. 如果我包含cglib / cglib-nodep(在答案中建议),则会出现编译错误: com.android.dex.DexException: Multiple dex files define Lnet/sf/cglib/beans/BeanCopier$BeanCopierKey 这是我的gradle.build的一部分: androidTestCompile ‘com.android.support.test:runner:0.3’ androidTestCompile ‘org.powermock:powermock-api-mockito:1.6.4’ androidTestCompile ‘org.powermock:powermock-module-junit4:1.6.4’ androidTestCompile ‘cglib:cglib-nodep:3.2.0’ androidTestCompile ‘cglib:cglib:3.2.0’ 我错过了什么? 提前致谢!

Android Mocking Dagger2为Espresso测试注入依赖项

我有一个严重dependency injection( dagger2 )应用程序。 我想在没有测试导航整个应用程序的情况下运行espresso测试 ,并登录到应用程序。 我想从我的teleActivity开始,并模拟登录管理器。 但是在任何@test函数中,我们已经调用了空指针,因为我们调用了onCreate。 如果我在启动活动之前覆盖它(如下所示),则活动为空。 根据我的理解,切换下划线依赖关系的能力是我们使用Dagger2的一个重要原因,否则它只是一个非常过度设计的单例。 如何覆盖,模拟或切换注射到测试匕首模块 – 所以我可以创建这个简单的浓咖啡测试。 注意我还在MVP设计模式中写了所有这些,如果这有所不同。 TeleActivity @Inject TelePresenter mTelePresenter; @Inject public LoginStateManager mLoginStateManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ButterKnife.bind(this); DaggerInjectorTele.get().inject(this); mTelePresenter.setTeleDependencies(this); Intent intent = getIntent(); String searchId = null; if (intent != null) { searchId = intent.getStringExtra(Constants.SEARCH_ID); } mTelePresenter.onCreateEvent(searchId, Helper.makeAuthorizationHeader( // CRASH Null pointer […]

使用Mockito单独测试Fragment类

添加了@VisibleForTesting并受到保护。 我的测试现在可以这个方法: @VisibleForTesting protected void setupDataBinding(List recipeList) { recipeAdapter = new RecipeAdapter(recipeList); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); rvRecipeList.setLayoutManager(layoutManager); rvRecipeList.setAdapter(recipeAdapter); } 使用间谍对象更新了测试用例:但是,即使我创建了一个将被调用的间谍模拟,真正的setupDataBinding(配方)也会被调用。 也许我做错了。 @Test public void testShouldGetAllRecipes() { RecipeListView spy = Mockito.spy(fragment); doNothing().when(spy).setupDataBinding(recipe); fragment.displayRecipeData(recipe); verify(recipeItemClickListener, times(1)).onRecipeItemClick(); } 我试图在我的Fragment类中测试方法,如下所示。 但是,我试图模拟方法来validation方法被调用正确的次数。 但是,问题是我有一个private方法setupDataBinding(…) ,它设置在从displayRecipeData(…)调用的RecyclerView上。 我想模拟这些调用,因为我不想在RecyclerView上调用真实对象。 我只想validationsetupDataBinding(…)被调用。 我曾尝试使用间谍和VisibleForTesting ,但仍不确定如何做到这一点。 我试图孤立地测试片段。 public class RecipeListView extends MvpFragment implements RecipeListViewContract { […]

如何在Android Studio的unit testing中使用Mockito / Hamcrest

我希望能够在Android Studio中进行unit testing和仪器测试,并在其中使用Mockito。 我在Android Studio 0.8中使用新方法进行测试。 这是: 用gradle建设 使用官方Android API进行测试(ActivityInstrumentationTestCase2等) 将测试放在应用程序的目录中,而不是作为单独的模块 在Android Studio中启动测试作为“Android测试”运行配置 如何在我的测试中编写代码,这些代码依赖于仅用于测试的库,例如mockito或hamcrest? 我想在编译和运行测试时包含这些库,但要避免将它们导出到已发布的.apk。 在https://code.google.com/p/mockito/wiki/DeclaringMockitoDependency中,我读过我应该将依赖项添加为: dependencies { …. testCompile “org.mockito:mockito-core:1.9.5” } 但是当我跑步时我得到: 构建脚本错误,找不到支持的Gradle DSL方法:’testCompile()’! 虽然我不确定它是否相关,但我使用的gradle构建文件是: apply plugin: ‘android’ dependencies { compile fileTree(dir: ‘libs’, include: ‘*.jar’) compile project(‘:android-sdk’) testCompile “org.mockito:mockito-core:1.9.5” } android { compileSdkVersion 19 buildToolsVersion “20.0.0” compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } sourceSets […]

如何使用Mockito和Robolectric嘲笑Context?

这是我的活动片段: public class Search extends Activity { private String TAG = “SEARCH”; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); Log.d(TAG, “About to call initialastion”); // new InitialisationTask(this).execute(); } } 通过上面注释的行,我可以愉快地创建和执行unit testing,如下所示: @RunWith(RobolectricTestRunner.class) public class SearchTest { private Search searchActivity; private Button searchButton; private Button clearButton; private Button loginButton; private Button registerButton; private EditText searchEditText; […]

获取junit.framework.AssertionFailedError:使用Unit和Mockito时,中没有find任何测试

我在我的android项目中添加了以下依赖项: // Unit testing dependencies androidTestCompile ‘junit:junit:4.12’ // Set this dependency if you want to use Mockito androidTestCompile ‘org.mockito:mockito-core:1.10.19’ 并使用junit4 api创建一个测试(例如,Adder是一个简单的类,它总结了int): @RunWith(MockitoJUnitRunner.class) public class AdderTest { @Test public void testValidAdd() { Adder adder = new Adder(); assertEquals(adder.add(1,1), 2); } } 当我尝试运行测试时,我得到: 运行测试测试运行已启动junit.framework.AssertionFailedError:在android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:android.test.AndroidTestRunner.runTest(AndroidTestRunner.run:)上的com.test.myapp.AdderTest中找不到测试。 176)在android.app.Instrumentation的android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)$ InstrumentationThread.run(Instrumentation.java:1701)完成 我在这里和这里读到,但没有任何帮助。 有谁看到我做错了什么/有什么输入?

注入模拟演示者对象的浓咖啡

我想更好地了解用于在android中测试的espresso框架,但是我在尝试模拟我的演示者时遇到了问题。 首先,我在我的应用程序上使用了一些改编的MVP架构,因此,我正在使用诸如View(Activity) – > Presenter – > Model – > Presenter – > View之类的东西来发出请求并更新UI。 我的活动一旦创建就会发出请求以更新所有UI,一旦收到结果,就会相应地更新UI。 public class MyActivity extends AppCompatActivity implements IPresenter{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); new Presenter().doRequestToUpdateUI(); } @Override public void onResponseReceived(UIObject uiOject){ findViewById(R.id.button).setVisibility(uiOject.getVisibility()); } } 但是,此doRequestToUpdateUI()需要一些以前的身份validation,因此需要模拟漏洞呈现器,以便在我的活动上测试其他UI。 有没有办法模拟我的演示者并将其注入活动,或者至少在调用方法doRequestToUpdateUI()时不执行任何操作。 我正在做这样的测试,但直到现在还没有工作。 @LargeTest @RunWith(AndroidJUnit4.class) public class MyActivityInstrumentationTest { @Mock public Presenter presenter; @InjectMocks […]

如何在创建活动之前模拟方法?

我有一个活动 public class MyActivity extends ActionBarActivity { public int i; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); i = getSomeInt(); } protected int getSomeInt() { return 1; // here can be an api-request } } 我想用robolectric 3.0和mockito测试它。 但我需要模拟getSomeInt()方法。 @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class) public class MyActivityTest { private MyActivity mActivity; @Before public void setUp() { […]