Tag: 单元测试

Kotlin – Mockito不能模拟/间谍(Spring REST API)

由于Kotlin中的所有课程都是默认的最终课程,所以Mockito不能窥探最后的课程: Cannot mock/spy class bye.persistence.jdbcTrial Mockito cannot mock/spy following: – final classes – anonymous classes – primitive types 而这个指南 (7月6日,丹尼·布鲁斯勒(Danny Preussler))说,一个框架是解决这个问题的必要条件。 现在我想知道,是否有可能测试一个REST API(使用Spring MockMvc)。 以下是我的测试代码: package byeTest.persistenceTest import bye.domain.User import bye.persistence.jdbcTrial import bye.spring.GreetingController import byeTest.persistenceTest.RestAPITest.RootConfig import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.BDDMockito.given import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.MediaType import org.springframework.test.context.ContextConfiguration […]

如何使用PowerMock模拟Kotlin类(最终)?

我想知道如何用PowerMock模拟kotlin final类,以便测试它。 我遵循指导来测试Java最终班,但我仍然有这个错误 Cannot subclass final class 有没有办法做到这一点?

不能用Mockito 2来嘲笑最终的Kotlin课堂

我无法使用Mockito 2来嘲笑Kotlin最后一堂课。另外,我正在使用Robolectric。 这是我的测试代码: @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class Test { // more mocks @Mock MyKotlinLoader kotlinLoader; @Before public void setUp() { MockitoAnnotations.initMocks(this); } } 当我们尝试初始化setUp()方法中的模拟时,测试失败。 另外,我在我的代码中使用下面的gradle依赖关系: testCompile 'org.robolectric:robolectric:3.3.2' testCompile 'org.robolectric:shadows-multidex:3.3.2' testCompile 'org.robolectric:shadows-support-v4:3.3.2' testCompile("org.powermock:powermock-api-mockito2:1.7.0") { exclude module: 'hamcrest-core' exclude module: 'objenesis' } testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-inline:2.8.9' 所有其他单元测试通过使用这种配置,但只要我试图嘲笑Kotlin类,它会引发以下错误: Mockito cannot mock/spy because : […]

Kotlin + Mockito2:演示者测试的ClassNotFoundException

我有一个基于CleanArchitecture-Android风格的Kotlin编写的示例应用程序。 以下是应用程序的配置: 演示/的build.gradle dependencies { implementation project(':domain') def presentationDependencies = rootProject.ext.presentationDependencies def commonDependencies = rootProject.ext.commonDependencies testCompile testingDependencies.junit testCompile testingDependencies.mockito // org.mockito:mockito-inline:2.10.0 } 呈现/ SRC /测试/ JAVA /包/ RepoPreferencesPresenterTest.kt internal class RepoPreferencesPresenterTest : UnitTest() { // FIXME: Mocking fails @Mock private lateinit var mockRepositoriesUseCase: RepositoriesUseCase @Mock private lateinit var mockView: RepoPreferencesContract.View private lateinit var presenter: RepoPreferencesPresenter<RepoPreferencesContract.View> […]

Java注释处理器 – 注释的Kotlin类单元测试

我有一个注释处理器库 ,我想为Kotlin工作,但是我的单元测试遇到了麻烦。 如果有人能给我一些建议,我将不胜感激。 我目前的单元测试实现使用Google的编译测试库。 我创建输入和输出类并将它们存储在资源目录中。 然后在单元测试期间,编译测试库编译输入java类,执行注释处理器,然后将生成的类与资源目录中的预期输出类进行比较。 这里是我所指的一个例子(从我的项目): 单元测试类 资源(输入和预期的输出类 这对我所有的基于java的单元测试都很有帮助。 但是,当我尝试使用Kotlin类编写一些测试时,我的测试无法加载类。 我相信这是由于编译测试库首先是一个Java特定的库(我没有看到他们的项目中提到Kotlin) 目前我遇到以下问题: java.lang.IllegalArgumentException: Compilation unit is not of SOURCE kind: "/C:/dev/gsonpath/gsonpath-compiler/build/resources/test/adapter/auto/field_types/primitives/valid/TestValidPrimitives.kt" at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:137) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64) at com.google.testing.compile.Compilation.compile(Compilation.java:69) at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:281) 这个问题相当明显,正在使用不正确的编译器。 当我的文件扩展名不是'.java'时引发异常。 如果我尝试使用'.java'文件扩展名加载Kotlin类,它不起作用,因为它的Java语法不正确。 有没有人遇到过这个问题,并解决了它? 我看了一些其他的注释处理器(比如DBFlow ),而且他们不用这种方式编写单元测试。 由于Kotlin最近才在注释处理中涉足,也许我是第一个有这个问题的?

Android SDK类上的Kotlin扩展函数的单元测试

Kotlin扩展功能非常棒。 但是我怎么能对它们进行单元测试呢? 尤其是那些Android SDK提供的类(如Context,Dialog)。 我在下面提供了两个例子,如果任何人都可以分享我可以如何进行单元测试,或者如果我真的想单元测试它们,我需要以不同的方式编写它们。 fun Context.getColorById(colorId: Int): Int { if (Build.VERSION.SDK_INT >= 23) return ContextCompat.getColor(this, colorId) else return resources.getColor(colorId) } 和 fun Dialog.setupErrorDialog(body : String, onOkFunc: () -> Unit = {}): Dialog { window.requestFeature(Window.FEATURE_NO_TITLE) this.setContentView(R.layout.dialog_error_layout) (findViewById(R.id.txt_body) as TextView).text = body (findViewById(R.id.txt_header) as TextView).text = context.getString(R.string.dialog_title_error) (findViewById(R.id.txt_okay)).setOnClickListener{ onOkFunc() dismiss() } return this } 任何建议将有所帮助。 谢谢!

测试双打的Kotlin哲学是什么?

测试双打的科特林哲学是什么? 由于所有的类和函数都被默认封装(不公开 ),像Mockito这样的嘲笑框架显然不是一流的公民。 已经写了很多关于这个问题的文章 ,还有关于可能的解决方案 ,但是Kotlin的设计师想要用双打来测试呢? 它是假货和存根,还是应该扮演你自己的间谍和嘲笑?

单元测试Kotlin协同程序延迟

我试图单元测试使用delay()的Kotlin协同程序。 对于单元测试,我不在乎delay() ,只是减慢测试速度。 我想以某种方式运行测试,当delay()被调用时实际上不会延迟。 我尝试使用委托给CommonPool的自定义上下文运行协程: class TestUiContext : CoroutineDispatcher(), Delay { suspend override fun delay(time: Long, unit: TimeUnit) { // I'd like it to call this } override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) { // but instead it calls this } override fun dispatch(context: CoroutineContext, block: Runnable) { CommonPool.dispatch(context, block) } } 我希望我可以从我的上下文的delay()方法返回,而是调用我的scheduleResumeAfterDelay()方法,我不知道如何将其委派给默认调度程序。

在Kotlin中测试不能访问受保护的方法

我想测试B类: class B : A { override fun init() { // do work here } } class A { protected fun init() { } // will be called by internal logic } 并在Java中没有问题调用: b.init()内的测试方法( 测试类是在与测试主题相同的包 ),但在Kotlin编译器抱怨: 不能访问'init':它在'B' @Test fun `checks init`() { val b = B() b.init() // assert work done } 为什么它不工作? 这怎么可能是解决方法(我想避免使方法公开)?

为什么Mockito不能在Kotlin中使用数字类型来模拟一个通用的参数类型?

我们正在将我们的项目转移到Kotlin语言。 我们决定从测试开始,但面临一些奇怪的行为。 这是我们的测试案例: Service.java public final class Service { private final JdbcTemplate jdbcTemplate; public Service(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public long check() { return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM table", Long.class); } } JavaTest.java (工作正常) @RunWith(MockitoJUnitRunner.class) public final class JavaTest { @Mock private JdbcTemplate jdbcTemplate; @InjectMocks private Service testSubject; @Test public void test() { //given […]