Tag: 单元测试

Mockito从来没有()不工作,然后rxjava2

我正在测试用Kotlin编写的一段相当简单的代码: o1.updateUser(params) .andThen(o2.reload()) 当updateUser失败时,我预计重装将不会被执行。 但是当使用Mockito 2和jUnit 5进行测试时,就会调用这个模拟。 嘲笑是这样做的: given(o1.updateUser(user)).willReturn(Completable.error(IllegalArgumentException()) given(o2.reload()).willReturn(Completable.complete()) 现在的问题是,代码的行为如预期的,这意味着在这种情况下,o2是从来没有实际调用,但单元测试Mockito声称有一个o1的调用。 测试断言如下所示: verify(o2, never()).reload() 我在这里做错了吗? 有没有解决的办法? 我是不是很了解操作员?

运行Spek测试显示错误“空测试套件”

与Kotlin熟悉了一下,我想介绍一下另一个Android-Java项目,作为测试的第一步。 我决定直接与Spek开始。 我添加了以下依赖关系来构建要测试的模块的渐变: testCompile 'junit:junit:4.12' testCompile "org.jetbrains.kotlin:kotlin-stdlib:1.0.2" testCompile "org.jetbrains.kotlin:kotlin-test-junit:1.0.2" testCompile "org.jetbrains.spek:spek:1.0.25" 其中我使用了SimpleTest类的git仓库的spek-samples: import org.jetbrains.spek.api.Spek import kotlin.test.assertEquals class SampleCalculator { fun sum(x: Int, y: Int) = x + y fun subtract(x: Int, y: Int) = x – y } class SimpleTest : Spek({ describe("a calculator") { val calculator = SampleCalculator() it("should return the result of adding […]

如何模拟返回Observable的被动库

所以我有知识库,它提供了客户端的Observable。 有没有办法我可以嘲笑这个存储库,所以我不需要从我的模拟器发送位置或使用真实的设备获得一些位置? 接口如下所示: interface RxLocationRepository { @SuppressLint("MissingPermission") fun onLocationUpdate(): Observable<Location> fun stopLocationUpdates() } 在我的客户端,我使用这样的: class LocationManager( val rxLocationRepository: RxLocationRepository){ private fun appendGeoEvent(location: Location) { val locationGeoEvent = LocationGeoEvent( accuracy = location.accuracy.toDouble(), latitude = location.latitude, longitude = location.longitude, timestampGeoEvent = location.time ) processGeoEvent(locationGeoEvent) } compositeDisposable.add(rxLocationRepository.onLocationUpdate() .subscribe(Consumer { location -> appendGeoEvent(location) })) …. 所以我发送这个获得的位置我的appendGeoEvent方法。 我可以使用例如Mockito,但我不知道如何嘲笑这个存储库,所以我可以使用假的位置。 另外,我想用Kotlin。

我怎么能测试一个方法是不是被称为非模拟对象?

我有一个测试如下,在给定的情况下,我想确保mainPresenter.presenterFunction()不被调用。 class MainPresenterTest { val mainPresenter: MainPresenter val mainView: MainView val mainBridge: MainBridge init { mainView = mock(MainView::class.java) webBridge = mock(MainBridge::class.java) mainPresenter = MainPresenter(mainView, mainBridge) } @Before fun setUp() { MockitoAnnotations.initMocks(this) } @Test fun simpleTeset1() { // Given whenMock(mainView.viewFunctionCondition()).thenReturn(true) // When mainPresenter.onTriggger() // Then verify(mainView).viewFunction1() verify(mainPresenter, never()).presenterFunction() verify(mainView, never()).viewFunction2() } } 然而它错误地指出 org.mockito.exceptions.misusing.NotAMockException: Argument passed […]

模拟与Mockito 2最后一课

我正在从当前正在进行的项目中删除Powermock,所以我试图用Mockito(mockito-core-2.2.28)重写一些现有的单一测试。 当我运行测试时,我有以下错误: org.mockito.exceptions.base.MockitoException: 不能模拟/间谍类com.ExternalpackagePath.External类 Mockito不能模拟/间谍,因为: 最后一堂课 我知道这个问题已经被问到( 如何用mockito来模拟最后一个类 , Mock对象用Mockito来调用最终类的静态方法 ),但是我没有找到我正在寻找的答案。 这是我的代码的摘录: public class MyClassToTest extends TestCase { private MyClass myClass; @Mock private Externalclass ext; // This class is final, I would like to mock it @Override protected void setUp() throws Exception { MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here ext = Mockito.mock(Externalclass.class); } […]

Android单元测试将不会使用正确的应用程序类

我正在遇到一些奇怪的行为,就像android在单元测试中选择Application类一样。 我在目录src/testDevelopmentDebug有Robolectric单元测试 我也有一些测试代码分别在src/testDevelopmentDebug和androidTestDevelopment进行单元测试和espresso测试。 共享代码是在src/sharedTest ,我有这样的设置在我的build.gradle文件中: sourceSets { // Android Studio / the Android Studio Kotlin Plugin will stop recognizing these source folders as source // folders without explicitly setting them main.java.srcDirs += 'src/main/kotlin' testDevelopmentDebug.java.srcDirs += 'src/testDevelopmentDebug/kotlin' androidTestDevelopment.java.srcDirs += 'src/androidTestDevelopment/kotlin' // Share code between UI and unit tests. def sharedTestDir = 'src/sharedTest/kotlin' androidTestDevelopment.java.srcDirs += sharedTestDir testDevelopmentDebug.java.srcDirs […]

用MVP + Dagger进行Android测试2

我使用依赖注入框架Dagger 2使用模式MVP创建Android应用程序。 应用程序具有用于将请求发送到REST的自定义IntentService。 每个活动都有自己的Dagger组件,用于提供包括Presenter(表示层)和Interactor(模型层)类的所有必需对象。 Presenter包含没有Android SDK的代码 – 只有逻辑。 Interactor可以启动IntentService来接收数据,包含ApplicationContext等 为了测试我的Java / Kotlin类,我使用了JUnit和我自己的模拟类。 对于使用Android SDK的Instrumented测试,我正在使用Espresso 。 这里是简单的测试我如何做(Kotlin): @RunWith(AndroidJUnit4::class) @MediumTest class SampleBehaviorTest : UiBehaviorTestBase() { @get:Rule val rule = IntentsTestRule<SampleActivity>(SampleActivity::class.java, true, false) @Inject lateinit var someService: SomeService @Before fun setUp() { (getApp().buildSampleComponent() as MockSimpleComponent).inject(this) val intent = Intent() rule.launchActivity(intent) } @Test fun should_display_trade_on_receive() { someService.doSomeJob() // Assert […]

代码覆盖内联函数

我有这个函数写在Kotlin inline fun <T> handleEmptyResult(observable: Observable<T>, crossinline resultEmptyCheckingFunc: (obj: T?) -> Boolean): Observable<T> { return observable .flatMap { if (resultEmptyCheckingFunc(it)) { Observable.error<T>(ResultEmptyError(Throwable())) } else { Observable.just(it) } } } 但是当我为这个函数创建单元测试时,它在报告中显示0覆盖。 我正在使用jacoco代码覆盖。 你们知道如何正确地单元测试内联函数吗? 谢谢!

什么访问修饰符可测试辅助方法?

在Java中,辅助方法通常被标记为protected而不是private ,所以在同一个包中的单元测试可以测试辅助方法。 (具体来说,我正在使用JUnit。) 这在Kotlin中似乎不起作用。 建议使用什么访问修饰符?

如何运行./gradlew测试

我试图从命令行测试一个应用程序。 当我从Android Studio运行测试时,一切都很顺利。 但是当我尝试运行命令时: ./gradlew test 我得到这个错误: Task 'test' not found in root project 'mvp_kotlin_example'. 我没有使用./gradlew构建或./gradlew干净的问题。 我刚刚创建了一个项目来尝试./gradlew测试,它工作。 在mvp_kotlin_example中,我使用Robolectric进行测试,并使用Kotlin进行开发。 那么我怎样才能让我的测试从命令行工作? 编辑: 这是一个开源项目,所以所有的代码都可以在这里找到 https://github.com/leandroBorgesFerreira/mvp-kotlin-example 这是我的build.gradle文件: apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply from: '../jacoco.gradle' android { compileSdkVersion 25 buildToolsVersion "25.0.0" defaultConfig { applicationId "br.com.simplepass.simplepassnew" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" } buildTypes […]