我正在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
)选择正确的实现?现在它仍然为空
答案 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,有人知道吗?