委托模拟以分隔 class

Delegate mocks to separate class

而不是这个:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {Application.class}, webEnvironment = 
SpringBootTest.WebEnvironment.DEFINED_PORT)
public abstract class AbstractIT {

   @MockBean
   private FooAdapter fooAdapter;

   @MockBean
   private BarAdapter barAdapter;

   public void mockFoo() {
      FooResponse dto = new FooResponse();
      when(fooAdapter.fooRequest()).thenReturn(dto);
   }

我想要那个:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {Application.class}, webEnvironment = 
SpringBootTest.WebEnvironment.DEFINED_PORT)
public abstract class AbstractIT {

   @MockBean/Autowired?
   MockProvider mockProvider;


class MockProvider {

   @MockBean
   private FooAdapter fooAdapter;

   @MockBean
   private BarAdapter barAdapter;

   public void mockFoo() {
      FooResponse dto = new FooResponse();
      when(fooAdapter.fooRequest()).thenReturn(dto);
   }

但是,我不知道将 Mockito 与 SpringRunner 结合使用是否可行。由于我们有很多适配器(比如 10 个),我不想过多地污染 AbstractIT,因此我想将这些依赖项的初始化和具体模拟委托给另一个 class照顾那个。

您必须在 @ContextConfiguration 中为每个要使用它的测试指定提供者 class:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {Application.class}, webEnvironment = WebEnvironment.DEFINED_PORT)
@ContextConfiguration(classes = {MockProvider.class}  // <-- this
public abstract class AbstractIT {

您必须确保对提供商进行配置 class:

@Configuration
public class MockProvider {

根据 @MockBean 文档:

The annotation can be used directly on test classes, on fields within your test, or on @Configuration classes and fields.