尝试模拟静态方法时出现以下异常。
对于SettingsUtility,当前线程中已经注册了静态mock,要创建新的mock,必须注销已有的静态mock注册
@Before
fun setUp() {
mockStatic(SettingsUtility::class.java) {
`when` { SettingsUtility.method(app) }.thenReturn { "" }}
}
Run Code Online (Sandbox Code Playgroud) 我知道这个问题被问了很多次,但我遵循了很多答案,但仍然不起作用
在此链接中,他们说我们必须在 gradle 中添加:
testImplementation 'org.mockito:mockito-inline:2.13.0'
Run Code Online (Sandbox Code Playgroud)
=>目前我有
testImplementation "org.mockito:mockito-inline:2.28.2"
Run Code Online (Sandbox Code Playgroud)
我的 MockMaker 文件中也有这一行:
mock-maker-inline
Run Code Online (Sandbox Code Playgroud)
然后你可以看到我的以下代码:
object ApiHelper {
fun <T> createService(
url: String,
clazz: Class<T>
): T
}
Run Code Online (Sandbox Code Playgroud)
在我的 UITEST 中
@Mock
private lateinit var service: myService
private lateinit var apiHelper: ApiHelper
@Before
fun setUp() {
apiHelper = mock(ApiHelper::class.java)
given(ApiHelper.createService(
anyString(),
MyService::class.java,
)).willReturn(service)
}
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题吗?我错过了什么吗?
使用 lambda 模拟内联函数时遇到问题。有课UserController,尝试tracer用函数来模拟createSpan。
用户控制器类:
class UserController(private val tracer:Tracer) {
fun subscribeUser() {
tracer.createSpan("GraphDB: subscribedUser") {
do something...
}
}
}
Run Code Online (Sandbox Code Playgroud)
createSpan内联函数:
inline fun <T> Tracer.createSpan(operationName: String, block: SpanContext.() -> T): T =
buildSpan(operationName)
.start()
.useOn(this, block)
Run Code Online (Sandbox Code Playgroud)
尝试过:
Mockito.`when`(mockTracer.createSpan<Any>(any(), any())).thenReturn(mockSpanContext)
Run Code Online (Sandbox Code Playgroud)
回报org.mockito.exceptions.misusing.InvalidUseOfMatchersException
Mockito.`when`(mockTracer.createSpan<SpanContext>("GraphDB: subscribedUser", any())).thenReturn(mockSpanContext)
Run Code Online (Sandbox Code Playgroud)
回报java.lang.NullPointerException
尝试了不同的方法,但仅返回org.mockito.exceptions.misusing.InvalidUseOfMatchersException或java.lang.NullPointerException。
我怎样才能用 lambda 模拟这个内联函数,或者只是忽略它,因为我不想测试这个函数?任何帮助表示赞赏。
用于test和android tests、单元测试和 UI 测试的 kotlin 库。
如果我将以下两行写为 build.gradle 的一部分,它就可以正常工作。
我的问题是,这是添加在测试和 Android 测试中使用的库的正确方法吗
构建.gradle
androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
Run Code Online (Sandbox Code Playgroud)
感谢您提出的宝贵建议
谢谢R
这是我的测试课:
class RocketListVMTest {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
private lateinit var sut: RocketListVM
private var activeOnlyToggle = false
private val repo: Repo = mock()
@Before
fun setUp() {
sut = RocketListVM(repo)
activeOnlyToggle = false
}
@Test
fun toggleActiveOnlyWithTrueCallsRepository() {
sut.toggleActiveOnly(true)
verify(repo).getActiveOnlyLocalRockets()
}
}
Run Code Online (Sandbox Code Playgroud)
具有以下依赖项:
androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.21.0'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'android.arch.core:core-testing:1.1.1'
Run Code Online (Sandbox Code Playgroud)
我已经src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker用mock-maker-inline里面创建了。
测试类失败,因为
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker …Run Code Online (Sandbox Code Playgroud) 假设我有一个 Java 类 Metrics。我在 Kotlin 中定义了一些关于 Metrics 的扩展函数
fun Merics.expose(name: String, value: Number) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
请注意,Java 类Metrics也有一个名为的方法expose,但具有不同的签名。
我创建了一个测试,在其中模拟了一个对象并调用了应该调用metrics扩展函数的代码路径。expose但是我如何验证这些扩展函数是否被调用呢?
我尝试使用mockk和mockito-kotlin,它们似乎都不知道该metrics对象有一个用不同签名调用的新函数expose。
我正在mockk和Junit5中为FileUtility类的伴随对象中定义的静态方法编写单元测试用例。
方法如下,
class FileUtility {
companion object {
fun getFileObject(fileName: String): File {
require(!StringUtils.isBlank(fileName)) { "Expecting a valid filePath" }
val file = File(fileName)
if (file.isHidden)
throw llegalArgumentException()
return file
}
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试用例如下,
@Test
fun `get file object test throws exception when file path is hidden`() {
val filePath = "filepath"
val file = mockk<File>()
every { file.isHidden } returns true
assertThrows(IllegalArgumentException::class.java) {
getFileObject(filePath)
}
verify { file.isHidden}
}
Run Code Online (Sandbox Code Playgroud)
出现以下错误,
Expected java.lang.Exception to be thrown, but nothing was thrown. …Run Code Online (Sandbox Code Playgroud) 我正在尝试对使用以下服务的类进行单元测试:
parserService.parseJsonStringToModel(json: String, adapterClass: Class<T>): T?
Run Code Online (Sandbox Code Playgroud)
我的第一个方法是用于ArgumentMatchers实现单元测试,如下所示:
Mockito.`when`(parserService.parseJsonStringToModel(ArgumentMatchers.any(), ArgumentMatchers.any<CreateAccountRequest>().javaClass)).thenReturn(null)
Run Code Online (Sandbox Code Playgroud)
由于在 Kotlin 中ArgumentMatchers.any()返回null,因此会生成NullPointerException不可为 null 的类型。所以我尝试使用Mockito-Kotlin库来避免这个问题。该方法如下所示:
whenever(parserService.parseJsonStringToModel(any(), any<CreateAccountRequest>().javaClass)).thenReturn(null)
Run Code Online (Sandbox Code Playgroud)
使用的库解决了第一个参数的问题,但仍然产生NullPointerException传递的第二个参数。
那么,如何创建ArgumentMatchersforClass<T>类型参数呢?