@SpyBean не работает с Pact и JUnit 5 - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь использовать @SpyBean, чтобы высмеивать метод @Component, и он не работает. @MockBean работает (следовал примеру ). Я пробовал, читал и исследовал много способов, но не смог заставить его работать.

Вот пример:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment. DEFINED_PORT)
@ExtendWith(SpringExtension::class)
@Provider("MyMicroService")
@PactFolder("../../../pacts")
internal class ClientContracts {

    @SpyBean
    private lateinit var myService: MyService

    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider::class)
    fun pactVerificationTestTemplate(context: PactVerificationContext) {
        context.verifyInteraction()
    }

    @State("default", "NO_DATA")
    fun toDefaultState() {
        reset(processService)
    }
}

(я очень упростил функцию тестирования, чтобы ее было легче читать, я бы на самом деле делал doReturn(...).when(...).blah())

Я всегда получаю ошибку "не фиктивно", потому что объект всегда является компонентом, завернутым в Spring CGLIB:

org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5
    at com.nhaarman.mockitokotlin2.MockitoKt.reset(Mockito.kt:36)
...

Я пробовал:

  • с @SpringJUnitConfig
  • с отдельным @TestConfiguration, но он был разрешен к тому же вышеуказанному компоненту
  • Использование Mockito.initAnnotations(this) в @BeforeEach
  • и более, я пробовал так много комбинаций, что не помню ...

Есть что-то, что я пропускаю? Или вариант, который я не знаю?

1 Ответ

0 голосов
/ 01 апреля 2019
  1. Данная проблема не связана с библиотекой JVM pact или pact
  2. Проблема не связана с пружиной
    • Spring - я использую spring с mockito, и это работает, простой примерэто:
import com.nhaarman.mockito_kotlin.doReturn
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.mock.mockito.SpyBean
import org.springframework.test.context.junit.jupiter.SpringExtension

@ExtendWith(value = [SpringExtension::class])
@SpringBootTest(
 webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
 classes = [Application::class]
)
internal class processorIntegrationTest : IntegrationTest() {

 @SpyBean
//    @MockBean
 private lateinit var processor: Processor;

 @Test
 internal fun abcd() {
     doReturn("something").`when`(processor).get()

     val get = processor.get()
     assertThat(get).isEqualTo("something")
 }
}

Mockito - mockito_kotlin или mockito расширение работает с SpyBean

Проблема о mockito + CGLIB

  • CGLIB -из ваших журналов похоже на class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5 поверх реализации вашего сервиса есть оболочка SpyBean.Что означает, что CGLIB-обертка нет, и ошибка для этого.Попробуйте удалить оболочку CGLIB, и она будет работать
...