Spring Boot测试:在不使用SpringRunner的情况下使@Autowired工作

时间:2019-10-29 17:38:42

标签: spring-boot pact

我正在Spring Boot应用程序中编写 契约提供者测试 。控制器有两个依赖关系,其中一个应该被模拟,另一个则不应该。

由于我正在编写pact test(这是我的新手),因此必须在测试类的顶部使用@RunWith(RestPactRunner.class)

在测试类中,我对不想模拟的依赖项使用@Autowired,但是由于我无法使用SpringRunner,因此我的测试不知道如何找到依赖项并离开则为null

这是 pact 提供程序测试:

@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)选择正确的实现?现在它仍然为空

3 个答案:

答案 0 :(得分:0)

使用注释@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一起使用,以测试您的控制器,所需的只是应用程序上下文中与Web相关的组件,其他层bean可以被模拟。

答案 1 :(得分:0)

在不使用@Autowired的情况下努力寻找BlockMapper(实际实现)之后,我终于使用mapstruct的{​​{1}}类在测试中找到实现,这就是我所做的它:

Mapper

答案 2 :(得分:0)

我使用了@RunWith(SpringRestPactRunner.class),但是它出错了:连接到localhost:8080,有人知道吗?