1

私のコントローラーにクリーンな単体テストを提供しようとしています。この Controller には依存関係として Service があり、この Serviceh には依存関係として Datasource があります。

テストは次のようになります。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration
public class ContentActionWebServiceControllerTest {
  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Autowired
  private MyService myService;

  @Test
  public void getRequestActionList() throws Exception {
    when(...)
    perform(...);
    verify(...);
  }

  @Configuration
  @ImportResource("...")
  static class MyTestConfiguration {

    @Bean
    public MyService myService() {
      return Mockito.mock(MyService.class);
    }
  }
}

そして MyService は次のようなものです

@Service
public class MyService {
  @Autowired
  private MyDataSource myDatasource;

  ...
}

MyService は Autowired プロパティ MyDataSource であるため、MyService の @Autowired アノテーションを満たす MyDataSource タイプが見つからないため、コンテキストは初期化されません。しかし、なぜこの注釈を解決しようとするのでしょうか? これはモックですか?

4

2 に答える 2

4

Mockito は cglib を使用して新しい子クラスを作成しMyServiceます (そしてすべてのメソッドをモック メソッドでオーバーライドします)。

それでも、これがSpringの仕事のやり方であるため、親の依存関係が注入されます。

いくつかの@Autowiredフィールドを持つ親クラスと、この親クラスから継承する子クラスがある場合、Spring は@Autowired子をインスタンス化するときに親のフィールドを注入します。あなたの場合と同じ動作だと思います。

のインターフェイスを使用するとMyService、問題が解決されます。

于 2013-04-10T21:00:49.397 に答える