Tag: 单元测试

用Kotlin和Spek创建一个抽象Spek来初始化共享对象

我正在用Kotlin + Spek框架编写单元测试。 到目前为止看起来不错,但我有一个问题,我不得不写很多样板代码,如果我想有一个类我测试的几个Spec对象。 这是我的代码来说明问题: object MyFirstSpec : Spek({ val myMock1: SomeObject1 = mock() val myMock2: SomeObject2 = mock() val myMock3: SomeObject3 = mock() val myMock4: SomeObject4 = mock() val myMock5: SomeObject5 = mock() val myMock6: SomeObject6 = mock() val myClass = MyClassToTest(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) given("something to test here") { //my test […]

Kotlin单元测试从Android Studio UI运行时始终通过

我试图在我的应用程序中用Kotlin实现一些单元测试。 发生的问题是,当我从UI运行测试时,测试总是通过,无论我做什么。 如果我从终端运行测试,一切都如预期,测试失败时,给出不正确的值。 有谁知道为什么发生这种情况? 这是从Android Studio中的问题吗? 有没有办法解决它? 即使这个测试通过从UI运行时 @Test fun testMe() { assertEquals(true, false) }

使用单元测试支持清理Kotlin中的协程

一段时间以来,我们正在与Kotlin合作,而我们目前正在关注的一件事情是使用Coroutines来处理我们想要运行异步的操作。 虽然示例的用法是清楚的,这是有效的,我有一些问题整合在一个干净的方式在我们的架构。 当看一个方法的领域为焦点的类的实现,这个想法是,它很容易阅读,有尽可能少的异步功能“噪音”。 我知道我不能有异步,没有实际使用它。 所以写这样的东西是我想要的: val data = someService.getData().await() // work with data 但是这是我想要阻止的: launch(UI) { val data val job = async(CommonPool) { data = someService.getData() } job.await() // work with data } 那么,我想配对这些领域为重点的类的实际单元测试,但我真的不能得到这个工作。 我们来看一个例子: // Some dependency doing heavy work class ApiClient { suspend fun doExpensiveOperation(): String { delay(1000) return "Expensive Result Set" } […]

没有开放课程,可以和Kotlin一起使用Mockito吗?

正如我们可能知道的那样,默认情况下Kotlin类曾经定义过,除非明确声明为open ,否则它是最终的。 当我们想用Mockito来模拟它时,这将会带来挑战。 我们需要明确宣布它是open 。 有没有办法我们可以避免宣布它是open而能够为我们的测试模拟它?

如何测试在Kotlin中调用顶层函数的代码?

我对Kotlin很新。 我有一个类调用顶级功能(这使得一个http调用)。 我正在尝试为我的课程编写单元测试,而不必将其发布到网络上。 有没有办法模拟/ powermock /拦截从我的课到Kotlin顶级功能的呼叫? class MyClass { fun someMethod() { // do some stuff "http://somedomain.com/some-rest/action".httpGet(asList("someKey" to "someValue")).responseString { (request, response, result) -> // some processing code } } } 它使用kittinunf / Fuel库进行httpGet调用。 它将一个顶级函数添加到String中,最终在Fuel(Fuel.get())中调用伴随对象函数。 单元测试需要拦截对httpGet的调用,以便我可以返回测试的json字符串。

如何使用Mockito Kotlin片段/活动来模拟kotlinx.android.synthetic的意见

我有一个在Kotlin写的片段。 我使用导入布局视图 导入kotlinx.android.synthetic.main.my_fragment_layout。* 在我的Fragment类中的一个方法中,我在布局中为TextView设置文本。 例如: fun setViews() { myTextView.text = "Hello" // In Java I would have used: // (getView().findViewById(R.id.myTextView)).setText("Hello"); } 在我的Mockito单元测试中,我想测试这个方法。 例如,如果上面的方法是用java编写的,我可以测试如下: public void setViewsTest() { // Mock dependencies View view = Mockito.mock(View.class); TextView myTextView = Mockito.mock(TextView.class); when(fragment.getView()).thenReturn(view); when(view.findViewById(R.id. myTextView)).thenReturn(myTextView); // Call method fragment.setViews(); // Verify the test verify(myTextView).setText("Hello"); } 当我在Kotlin中编写片段时,如何执行类似的实现,并使用以下导入视图: import kotlinx.android.synthetic.main.my_fragment_layout。

使用kotlin时,在单元测试和仪器测试之间共享代码

类似的问题: 在Android Studio中的Android Instrumentation测试和单元测试之间共享代码 我的设置如下: 包含单元测试的src/test文件夹。 这些可以是Java或Kotlin类 包含仪器测试的src/androidTest 。 这些也可以是Java或Kotlin类 src/sharedTest是一个文件夹,它包含一系列在单元测试和测试测试之间共享的utils。 这个共享在Gradle中被定义为: sourceSets { test.java.srcDirs += 'src/sharedTest/java' androidTest.java.srcDirs += 'src/sharedTest/java' } 这允许src/test或src/androidTest任何Java类访问utils。 但不是Kotlin单元测试。 我的假设是他们没有被添加到sourceSets。 我的问题是:我如何添加它们? 我试过了: sourceSets { test.kotlin.srcDirs += 'src/sharedTest/java' } 但是这似乎并不奏效。

gradle插件3.0后,kotlin单元测试失败

将Android Studio更新至3.0后,由于以下原因,我一直在收到失败的测试: java.lang.NullPointerException at org.mockito.internal.util.ConsoleMockitoLogger.log(ConsoleMockitoLogger.java:13) at org.mockito.internal.junit.UnusedStubbings.format(UnusedStubbings.java:39) at org.mockito.internal.junit.UniversalTestListener.emitWarnings(UniversalTestListener.java:70) at org.mockito.internal.junit.UniversalTestListener.testFinished(UniversalTestListener.java:47) at org.mockito.internal.junit.JUnitRule$1.evaluate(JUnitRule.java:50) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:114) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:57) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at […]

Kotlin:在单元测试中使内部函数可见

如果测试与生产代码(这是常见的)在不同的模块中,测试内部函数的可见性最好的方法是什么? 在Java中,我会将生产代码和测试放在同一个包中,并使待测试的包是私有的(另外,如果将其包含为私有的而不是私有的唯一原因,请添加@VisibleForTest注释是测试)。 不幸的是,Kotlin没有包私有的概念。

Rx-Kotlin awaitTerminalEvent永远不会完成

我想更好地了解如何使用Rx-Kotlin进行单元测试,但是我还没有能够成功地将主题设置为“完成”。 因此,我总是等待5秒的时间(onComplete应该立即),然后在assertComplete上失败。 我对awaitTerminalEvent的理解是,它应该只阻塞,直到onComplete被调用。 我也看了一下TestScheduler,但是我不认为应该在这里需要。 任何帮助或文件,可以带领我在正确的方向将不胜感激。 @Test fun testObservable() { val subject = BehaviorSubject.create<Int>() subject.onNext(0) TestSubscriber<Int>().apply { subject.subscribe({ System.out.println(it) subject.onNext(1) subject.onComplete() }) this.awaitTerminalEvent(5, TimeUnit.SECONDS) this.assertComplete() this.assertValue(1) } }