Я хочу имитировать свой класс службы и вызывать любые методы, которые он наследует от абстрактного класса и интерфейса, как будто они принадлежат службе. К сожалению, когда я имитирую сервис и вызываю методы из абстрактного класса, тогда mockito вызывает реальные методы в абстрактном классе. Можно ли как-то полностью имитировать класс обслуживания?
Интерфейс:
interface MessageProducer<T> {
fun sendMessage(data: T)
}
Абстрактный класс:
abstract class AuditableMessage<T>(
private val auditService: AuditService
) : MessageProducer<T> {
protected abstract val auditPoint: String
fun sendAuditJsonMessage(data: T) {
auditService.auditJson(auditPoint, data as Any)
sendMessage(data)
}
)
Concerete Spring Service
@Service
class ClientProducer(
private val kafkaProducer: KafkaTemplate<String, String>,
auditService: AuditService
) : AuditableMessage<String>(auditService) {
override val auditPoint: String = "MY_AUDIT_POINT"
override fun sendMessage(data: String) {
kafkaProducer.sendDefault(data)
}
}
Тестовый класс
@ExtendWith(MockitoExtension::class)
internal class ClientRequestServiceTest {
@Mock
lateinit var clientProducer: clientProducer
@InjectMocks
lateinit var clientRequestService: ClientRequestService
@Captor
lateinit var requestCaptor: ArgumentCaptor<String>
@Test
fun `test createClient creates request and calls send message`() {
...
clientRequestService.createClient(clientData)
verify(clientProducer).sendAvroAuditJsonMessage(capture(requestCaptor))
}
}
Обновить тестовый пример: У меня есть служба по умолчанию, которая вводит ClientProducer и вызывает его метод.
@Service
class ClientRequestService(
private val primeClientProducer: clientProducer
) {
fun createClient(clientData: PrimeAddClientInput) {
try {
clientProducer.sendAvroAuditJsonMessage("TEST")
} catch (e: Exception) {
log.error {""}
throw e
}
}
@ExtendWith(MockitoExtension::class)
internal class ClientRequestServiceTest {
@Mock
lateinit var primeClientProducer: PrimeClientProducer
@InjectMocks
lateinit var clientRequestService: ClientRequestService
@Captor
lateinit var requestCaptor: ArgumentCaptor<String>
@Test
fun `test createClient creates request and calls send message`() {
val clientData = easyRandom.nextObject(String::class.java)
clientRequestService.createClient(clientData)
verify(primeClientProducer).sendAvroAuditJsonMessage(capture(requestCaptor))
val request = requestCaptor.value
verify("TEST", request)
}
}
Exception:
java.lang.NullPointerException
at code.AuditService.auditJson$default(AuditService.kt:41)
at code.AuditableMessage.sendAvroAuditJsonMessage(AuditableMessage.kt:23)
at code.ClientRequestService.createClient(ClientRequestService.kt:20)
Таким образом, он в основном вызывает auditService.audit Json (...), но не