如何在我的测试中共享 @MockBeans 和模拟方法而不继承?

Dhe*_*rik 4 inheritance junit spring integration-testing mocking

我有一个基本测试场景,将由其他集成测试使用。此场景包括一些@MockBean用于外部集成的模拟 bean ( )。

今天,我在集成测试课上有这样的内容:

@SpringBootTest
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@RunWith(SpringRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderIT {
Run Code Online (Sandbox Code Playgroud)

以及准备集成测试的字段和注释:

private MockMvc mockMvc;

@Autowired
private WebApplicationContext wac;

@Autowired
private ObjectMapper mapper;

@MockBean
private SomeGateway someGateway;

@MockBean
private SomeRabbitMqService someRabbitMqService ;

@MockBean
private AnotherRabbitMqService anotherRabbitMqService;

@MockBean
private SomeIntegrationService someIntegrationService ;

@MockBean
private Clock clock;

@Before
public void setup() {
    //some methods mocking each service above, preparing mockMvc, etc
}
Run Code Online (Sandbox Code Playgroud)

此场景对于使用MockMvc和创建系统中的主要功能 my是必要的Order。这Order是通过调用 Rest API 中的 POST 方法创建的,并将其保存order在内存数据库中。

即使这运行良好,我也需要在另一个测试中复制包含这些@MockBean和一些内容的代码块@Autowired,因为这Order是将产品添加到订单、设置要交付的地址等的基本场景。每个场景都有不同的集成测试,但是他们都需要一个Order.

那么,如何在我的集成测试中共享“MockBeans”以及模拟它们的方法?我在测试中使用继承的经历非常糟糕,我真的很想尝试不同的方法。

Dhe*_*rik 7

我最终使用了Spring 配置文件。

我创建了一个带有注释的配置类,@Profile("test")并在那里创建了模拟 bean。喜欢:

@Profile("test")
@Configuration
public class MyMockConfiguration {

    @Bean
    public SomeService someService() {
        SomeService someService = mock(SomeService .class);
        // mocked methods and results
        return someService ;
    }
Run Code Online (Sandbox Code Playgroud)

在测试类中:

@ActiveProfiles("test")
@SpringBootTest
@WebAppConfiguration
@RunWith(SpringRunner.class)
public class MyControllerIT {
Run Code Online (Sandbox Code Playgroud)

如果某些集成测试需要覆盖配置文件上当前的模拟实现,则测试只需@MockBean在类上声明并像往常一样在模拟上进行。

我还不确定这是否test是一个好名字,因为对我来说,通过“上下文”模拟配置更有意义。test因此,我可以使用并拥有不同的配置配置文件,而不是在配置文件名称上使用createOrder通用名称,每个配置文件都有不同的名称和不同的模拟:createOrder, createOrderWithoutProducts。