以下のクラスの設定があります。Spring:フィールドとコンストラクタの両方の注入を持つクラスの単体テスト
class Base {
@Autowired
private BaseService service; //No getters & setters
....
}
@Component
class Child extends Base {
private final SomeOtherService otherService;
@Autowired
Child(SomeOtherService otherService) {
this.otherService = otherService;
}
}
私はChild
クラスのユニットテストを書いています。 @InjectMocks
を使用すると、otherService
がnullになります。私が使用する場合は、クラスのコンストラクタをテストのセットアップで使用すると、Base
クラスのフィールドはnull
になります。
フィールド注入についてのすべての議論は悪いことを知っていますが、Base
とChild
クラスがそのプロパティを注入する方法を変更することなくこれを解決する方法があるかどうかを知ることにもっと興味がありますか?
ありがとうございます!
public class Test {
// Create a mock early on, so we can use it for the constructor:
OtherService otherService = Mockito.mock(OtherService.class);
// A mock for base service, mockito can create this:
@Mock BaseService baseService;
// Create the Child class ourselves with the mock, and
// the combination of @InjectMocks and @Spy tells mockito to
// inject the result, but not create it itself.
@InjectMocks @Spy Child child = new Child(otherService);
@Before
public void before() {
MockitoAnnotations.initMocks(this);
}
}
Mockitoが正しいことを行う必要があります。
はい、Springを使用して注入を行わないでください。モックを作成してテスト設定に注入します。 – duffymo
詳しく説明できますか? モックを作成できますが、モックを挿入することはできません。 '@InjectMocks'を使ってモックを注入すると、' Child'クラスのプロパティはコンストラクタインジェクションを使うので 'null'です。私はテストから 'Base'クラスのプロパティを渡す方法がないので、コンストラクタを使ってテスト中のクラスを初期化することはできません。 – Mubin
テストケースを含めます。 –