mockito 异常:指定为非空的参数为空:如何为模拟测试注入字段

rkttyhzu  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(212)

我有一个服务:

@Service
class ArchiveService(
        val fnaReactiveClient: FNAReactiveClient,
        val resolvedTopicPrefix: String)

我有Config:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
class CoreKafkaConfig {
    
    @Value("\${kafka.topicPrefix:}")
    lateinit var topicPrefix: String

    @Bean
    fun resolvedTopicPrefix() = run {
        KafkaTopicsUtil.resolveTopicPrefix(topicPrefix)
    }

在我的测试中:

@ExtendWith(MockitoExtension::class)
class ArchiveServiceTest {

    @InjectMocks
    lateinit var archiveService: ArchiveService

    @Mock
    lateinit var fnaReactiveClient: FNAReactiveClient

    
 @Test
    fun `create archive with duplicate filenames`() {
        val user = "user"
      
... some when and given block ....

        val newDocVer = archiveService.archiveDoc("integration", null, req, ecmHeaders, EcmServiceAsyncConfig.MethodType.ARCHIVE)
       assertEquals(newId, newDocVer)
       
... some verify block ....
        }
    }

我有一个例外:
无法示例化类型为'class tu.xxxx.ecm.services.service. ArchiveService'的名为'archiveService'的@InjectMocks字段。您在字段声明时没有提供示例,因此我尝试构造示例。但是构造函数或初始化块引发了异常:指定为非null的参数为null:方法tu.xxx.ecm.services.service.ArchiveService.,参数resolvedTopicPrefix
我做错了什么????

vyswwuz2

vyswwuz21#

问题是你需要两个参数来创建ArchiveService。但是...只定义了一个mock。记住,在执行单元测试时,不会创建bean,也不会执行Spring DI注入。
所以,你能做什么.事实上-不是很多.请看这个线程:Injecting a String property with @InjectMocks
然而,有一些变通方法,人们可能会争论这种方法的可读性。
因此,我建议不要在测试中使用@InjectMock

@ExtendWith(MockitoExtension::class)
class ArchiveServiceImplTest {

    lateinit var instance: ArchiveServiceImpl

    @Mock
    lateinit var clientMock: Client

    @BeforeEach
    fun setup() {
        instance = ArchiveServiceImpl(clientMock, "fakeId")
    }

    @Test
    fun test() {
        instance.archive("")
    }
}

相关问题