Тест Spring Boot: заставить @Autowired работать без использования SpringRunner - PullRequest
0 голосов
/ 29 октября 2019

Я пишу тест поставщика pact в приложении Spring Boot. Контроллер имеет две зависимости, для которых одна из них должна быть смоделирована, а другая - нет.

Поскольку я пишу pact test (который я новичок в этом),Я должен использовать @RunWith(RestPactRunner.class) поверх моего тестового класса.

в моем тестовом классе я использую @Autowired для зависимости, которую я не хочу высмеивать, но так как я не могу использовать SpringRunner, мой тест не знает, как найти зависимость, и оставляет ееas null.

Вот тест поставщика * :

@RunWith(RestPactRunner.class)
@Provider("provider_name")
@PactFolder("target/pacts")
public class SampleProviderTest {
    private MetadataController metadataController;

    @Mock
    private BlockService blockService; // dependency #1: to be mocked

    @Autowired
    private BlockMapper blockMapper; // dependency #2: to be injected

    @TestTarget
    public final MockMvcTarget target = new MockMvcTarget();

    @Before
    public void before() {
        initMocks(this);
        metadataController = new MetadataController(blockService, blockMapper);
        target.setControllers(metadataController);
    }


    /*
    * you can ignore the rest of this test class
    */


    @State("block info")
    public void blockInfo() {
        Block requestedBlock = new Block();
        when(blockService.getBlockInfo(123L, 12345L, "S1", "B1")).thenReturn(requestedBlock);
    }

}

Вопрос :
- как мне получить этот тест, чтобы подобрать правильную реализацию для зависимости # 2 выше (blockMapper)? сейчас он остается нулевым

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

после борьбы с тем, как найти BlockMapper (фактическая реализация) без использования @Autowired Я наконец-то использовал класс mapstruct Mapper, чтобы найти реализацию в моем тесте, вот как я это сделал:

@RunWith(RestPactRunner.class)
@Provider("provider_name")
@PactFolder("target/pacts")
public class SampleProviderTest {
    private MetadataController metadataController;

    @Mock
    private BlockService blockService; // dependency #1: to be mocked

    @TestTarget
    public final MockMvcTarget target = new MockMvcTarget();

    @Before
    public void before() {
        initMocks(this);

        // dependency #2: to be injected
        BlockMapper blockMapper = Mappers.getMapper(BlockMapper.class);

        metadataController = new MetadataController(blockService, blockMapper);
        target.setControllers(metadataController);
    }


    /*
    * removed the remainder...
    */
}
0 голосов
/ 30 октября 2019

Используйте аннотацию @RunWith(SpringRestPactRunner.class) вместо @RunWith(RestPactRunner.class). Использование SpringRestPactRunner вместо PactRunner в качестве бегуна Junit позволяет нам использовать аннотации пружинных тестов.

@RunWith(SpringRestPactRunner.class)
@Provider("provider_name")
@PactFolder("target/pacts")
public class SampleProviderTest {
    private MetadataController metadataController;

Вы также можете попробовать использовать аннотацию@WebMvcTest(MetadataController.class) вместе с springrestpackrunner для тестирования вашего контроллера все, что вам нужно, это веб-компоненты в контексте приложения, а другие компоненты уровня могут быть смоделированы.

...