Тестирование класса Spring Service, расширяющего абстрактный класс и интерфейс - PullRequest
0 голосов
/ 04 августа 2020

Я хочу имитировать свой класс службы и вызывать любые методы, которые он наследует от абстрактного класса и интерфейса, как будто они принадлежат службе. К сожалению, когда я имитирую сервис и вызываю методы из абстрактного класса, тогда 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 (...), но не

1 Ответ

0 голосов
/ 04 августа 2020

У меня есть несоответствия в зависимостях. Теперь работает корректно

...