22

@Autowiredクラス内のさまざまなフィールドでアノテーションを使用し、フィールドを設定できるセッターまたはコンストラクターを作成していないとしましょう。

質問 - アクセス修飾子はどうあるべきですか、privateまたはpackage-private(つまり、なし) ?

例えば:

public class MyClass {
    @Autowired
    private MyService myService;
}

public class MyClass {
    @Autowired
    MyService myService;
}

最初のケース (privateフィールド) では、セッターがなくても、Spring はリフレクションを使用してフィールドを接続します。

2 番目のケース (package-privateフィールド) では、テスト目的でクラスを拡張する必要がある場合に、これらのフィールドにアクセスできます (たとえば、モックをセットアップするため)。

どちらの場合も問題なく動作しますが、特にテストに関しては、どちらがより推奨されますか?

4

5 に答える 5

9

どちらの場合も問題なく動作しますが、特にテストに関しては、どちらがより推奨されますか?

プロパティは次のようにする必要があると思いますprivate

@Autowired
private MyService myService;

他のクラスがプロパティに直接アクセスできるようにするのではなく、プロパティへのアクセスを提供する getter メソッドを持つことは常に良いことです。

また、テスト目的での注入はmocks、プロパティの注入private propertiesと同じように機能しpackage-privateます。

たとえば、 のモックを次のように挿入Mockitoできます。private MyServiceMyClass

public class MyClassTest {

    @Mock
    MyService service;

    @InjectMocks
    MyClass serv = new MyClass();

    @Before
    public void init() {
    MockitoAnnotations.initMocks(this);
    }
}
于 2013-10-30T12:44:49.537 に答える
8

私は通常、フィールドを非公開にし、セッター注入を使用することを好みます。

public class MyClass {

    private MyService myService;

    @Autowired
    public void setMyService(MyService myService) {
        this.myService = myService;
    }
}   

サービスを @Autowired にすることを許可しますが、単体テスト用にモック インスタンスを設定します。

于 2013-10-30T12:43:08.207 に答える
6

最初のケースでは、フレームワークに応じてモックを注入することもできます。たとえば@InjectMocks、Mockito のアノテーションを使用します。ReflectionTestUtils.setField春のテストにもあります...

私は個人的に、テスト目的でクラスをあまり変更するのが好きではないので、最初のケースに行きます。しかし、結局のところ、これは主に好みのテスト フレームワークに依存します。

于 2013-10-30T12:41:43.063 に答える