簡體   English   中英

在Spring測試中模擬依賴的Autowired依賴

[英]Mocking an Autowired dependency of a dependency in Spring tests

我正在嘗試在測試中模擬依賴項的依賴項。 下面是我的班級樣子。

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為空。 我的設置中是否缺少某些東西,或者這樣做是錯誤的方式?

謝謝。

使用@MockBean因為這將在執行測試方法docs之前將模擬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();
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM