Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lateinit属性模拟对象尚未初始化_Java_Unit Testing_Kotlin_Testing_Mocking - Fatal编程技术网

Java lateinit属性模拟对象尚未初始化

Java lateinit属性模拟对象尚未初始化,java,unit-testing,kotlin,testing,mocking,Java,Unit Testing,Kotlin,Testing,Mocking,我试图用注释@MockBean初始化(通过模拟)两个对象 它似乎只有在调用方法mock(className)时才起作用,但是因为我想在多个方法上使用mock类,所以我不想在测试方法中重复相同的代码 这是我的测试课: @RunWith(MockitoJUnitRunner::class) class WordServiceTest { @MockBean lateinit var wordRepositoryMock: WordRepository @MockBean

我试图用注释@MockBean初始化(通过模拟)两个对象

它似乎只有在调用方法mock(className)时才起作用,但是因为我想在多个方法上使用mock类,所以我不想在测试方法中重复相同的代码

这是我的测试课:

@RunWith(MockitoJUnitRunner::class)
class WordServiceTest {

    @MockBean
    lateinit var wordRepositoryMock: WordRepository

    @MockBean
    private lateinit var wordMapperMock: WordMapper

    @Test
    fun findAllTest() {
        // Error: lateinit property wordRepositoryMock has not been initialized
        val wordService = WordService(wordRepositoryMock, wordMapperMock)
        `when`(wordRepositoryMock.findAll()).thenReturn(listOf(
                WordEntity(UUID.randomUUID(), "xxx"),
                WordEntity(UUID.randomUUID(), "xxx")))
        assertEquals(2, wordService.findAll().size)
    }

    @Test
    fun wordExistsTest() {
        // This works fine
        val wordRepositoryMock = mock(WordRepository::class.java)
        val wordMapperMock = mock(WordMapper::class.java)
        val wordService = WordService(wordRepositoryMock, wordMapperMock)
        val word = "xxx"
        `when`(wordRepositoryMock.existsWordEntityByName(word)).thenReturn(true)
        assertEquals(true, wordService.wordExists(word))
    }
}
我不想使用Spring Boot@Autowired注释,因为我的Spring应用程序需要我不想加载的上下文

我得到的错误是:

lateinit property wordRepositoryMock has not been initialized
kotlin.UninitializedPropertyAccessException: lateinit property wordRepositoryMock has not been initialized
依赖项:

dependencies {
    ...
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation ('org.springframework.boot:spring-boot-starter-test') 
    testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
    testImplementation "org.junit.jupiter:junit-jupiter-params:5.5.2"
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.6.2"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.6.2"
    testImplementation("io.rest-assured:spring-mock-mvc:4.0.0")
    testImplementation("io.mockk:mockk:1.9.3")
    testImplementation "org.testcontainers:postgresql:1.11.3"
    testImplementation "org.springframework.kafka:spring-kafka-test:2.2.7.RELEASE"
    runtimeOnly('org.postgresql:postgresql')
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation "org.mockito:mockito-junit-jupiter:3.3.3"
}

MockitoJUnitRunner
使用
@Mock
注释

@MockBean
来自Spring,因此您需要使用
@SpringRunner

但是,您的示例似乎不需要Spring,因此您可以切换到
@Mock

@RunWith(MockitoJUnitRunner::class)
类WordServiceTest{
@嘲弄
私有lateinit var wordRepositoryMock:WordRepository
@嘲弄
私有lateinit var wordMapperMock:WordMapper
}
如果您升级到Junit5(我只在Junit5中测试了它),您还可以做进一步的改进。构造函数参数是
lateinit
的一个很好的替代方法:

@ExtendWith(MockitoExtension::class)
类WordServiceTest(
@Mock val wordRepositoryMock:WordRepository,
@Mock val wordMapperMock:WordMapper
) {
}

我通过在setUp()中调用initMocks方法解决了这个问题


谢谢你的回答。将鼠标悬停在MockitoExtension::class上会出现以下错误:
类型不匹配。必需:KClass找到:KClass
您使用哪些依赖项?抱歉,它应该是
@extendedwith(MockitoExtension::class)
Ye我发现了这一点,但我现在遇到了以下错误:
org.junit.platform.launcher.core.DefaultLauncher handleThrowable警告:ID为“junit jupiter”的TestEngine无法发现测试
请参阅更新的帖子了解我的gradle依赖项如果您现在尝试升级junit,这已经成为一个完全不同的问题;)
@Test
注释位于不同的包中。小心不要把两者混在一起。我将首先尝试使其与现有版本一起工作(我的第一个示例)。虽然没有尝试过,但也许下面的方法也能奏效<代码>@RunWith(MockitoJUnitRunner::class)类WordServiceTest(@Mock-val-wordRepositoryMock:WordRepository,@Mock-val-wordMapperMock:WordMapper){}我尝试了这两种方法,但都给出了不同的错误。对于第一个版本,我得到了错误:
kotlin.UninitializedPropertyAccessException
使用@Test of package:
import org.junit.jupiter.api.Test
@BeforeEach
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        ....
    }