首页 > 解决方案 > 在 Spring 测试中模拟依赖项的自动装配依赖项

问题描述

我试图在我的测试中模拟依赖项的依赖项。下面是我的课程的样子。

class A {
  @Autowired B b;
  @Autowired C c;

  public String doA() {

    return b.doB() + c.doC();
  }
}

class C {
  @Autowired D d;

  public String doC() {

    return d.doD();
  }
}

class D {

   public String doD() {

      return "Hello";
   }
}

我试图在调用方法 doA() 时模拟 D 类中的方法 doD(); 但是,我不想模拟 B 类中的 doB() 方法。下面是我的测试用例。

@RunWith(SpringRunner.class)
@SpringBootTest(
  classes = MyTestApplication.class,
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
public class ATest {

  @Autowired
  private A a;

  @InjectMocks
  @Spy
  private C c;

  @Mock
  private D d;

  @Before
  public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testDoA() {

    doReturn("Ola")
      .when(d)
      .doD();

    a.doA();
  }
}

这仍然最终返回“Hello”而不是“Ola”。我在测试类中也尝试了A上的 @InjectMocks 。但这只会导致自动装配的 B 依赖项 B 为空。我的设置是否缺少某些东西,或者这是错误的方法?

谢谢你。

标签: javaspringmockito

解决方案


使用它会在执行测试方法docs@MockBean之前将模拟 bean 注入到应用程序上下文中。

可用于将模拟添加到 Spring ApplicationContext 的注释。可以用作类级别注释或@Configuration 类中的字段,或@RunWith SpringRunner 的测试类。

@RunWith(SpringRunner.class)
@SpringBootTest(
classes = MyTestApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

  public class ATest {

  @Autowired
  private A a;

  @MockBean
  private D d;

  @Test
  public void testDoA() {

   doReturn("Ola")
      .when(d)
      .doD();

    a.doA();
   }
}

推荐阅读