2016-05-21 15 views
6

Mã của tôi như dưới đây, đề cập đến các giải pháp trong https://stackoverflow.com/a/30308199/3286489Parameter quy định như không null là null khi sử dụng Mokito anyObject() trên chức năng Kotlin

import org.mockito.Mock 
import org.mockito.Mockito 
import org.mockito.MockitoAnnotations 
import org.mockito.Mockito.* 

class SimpleClassTest { 

    private fun <T> anyObject(): T { 
     Mockito.anyObject<T>() 
     return uninitialized() 
    } 

    private fun <T> uninitialized(): T = null as T 
    lateinit var simpleObject: SimpleClass 
    @Mock lateinit var injectedObject: InjectedClass 


    @Before 
    fun setUp() { 
     MockitoAnnotations.initMocks(this) 
    } 

    @Test 
    fun testSimpleFunction() { 
     simpleObject = SimpleClass(injectedObject) 

     verify(injectedObject).settingDependentObject(anyObject()) 

    } 
} 

tôi vẫn còn có những lỗi dưới đây

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method my.package.InjectedClass.settingDependentObject, parameter dependentObject 

Tôi có nhớ gì không?

CẬP NHẬT Dưới đây là mã thử nghiệm (dạng đơn giản và làm việc)

class SimpleClass(val injectedClass: InjectedClass) { 

    fun simpleFunction() { 
     injectedClass.settingDependentObject(DependentClass(Response.Builder().build())) 
    } 
} 

open class DependentClass(response: Response) { 

} 

open class InjectedClass() { 
    lateinit var dependentObject: DependentClass 

    fun settingDependentObject(dependentObject: DependentClass) { 
     this.dependentObject = dependentObject 
    } 
} 

Trả lời

9

Theo mặc định Kotlin classes and members are final. Mockito cannot mock final classes or methods. Như vậy khi bạn viết:

verify(injectedObject).settingDependentObject(anyObject()) 

các thực hiện thực được gọi là đòi hỏi đối số null không.

Để khắc phục hoặc mở lớp và phương thức hoặc thậm chí tốt hơn, hãy thay đổi SimpleClass để chấp nhận giao diện làm đối số hàm tạo của nó và giả lập giao diện thay thế.

+0

Lớp injectObject của tôi đã là lớp mở. Các thiết lậpDependentObject yêu cầu một đối tượng không null, nhưng anyObject() trả về null. Đó là lý do tại sao tôi nghĩ giải pháp trong http://stackoverflow.com/a/30308199/3286489 sẽ giúp tôi khắc phục vấn đề cần thiết. Nhưng nó vẫn không hoạt động. – Elye

+0

@Elye vui lòng thêm nguồn 'InjectedClass' vào câu hỏi – miensol

+0

Đã thêm lớp học để được kiểm tra vào Cập nhật ở trên. Cảm ơn! – Elye

1

Có một dự án đặc biệt giúp giải quyết vấn đề với Kotlin "đóng cửa theo mặc định" trong thử nghiệm đơn vị với Mockito. Đối với JUNIT, bạn có thể sử dụng kotlin-testrunner, đây là một cách dễ dàng để thực hiện bất kỳ kiểm tra Kotlin nào tự động mở các lớp để thử nghiệm khi chúng được nạp bởi trình nạp lớp. Cách sử dụng rất đơn giản, chỉ cần thêm một chú thích của @RunWith(KotlinTestRunner::class), ví dụ:

@RunWith(KotlinTestRunner::class) 
class MyKotlinTestclass { 
    @Test 
    fun test() { 
    ... 
    } 
} 

này được triệt để bao gồm trong bài viết Never say final: mocking Kotlin classes in unit tests

này bao gồm các trường hợp sử dụng của bạn một cách tự động bằng cách cho phép tất cả các lớp học được chế giễu nếu không sẽ không được phép.

Các vấn đề liên quan