web-dev-qa-db-ja.com

JUnitで@Autowiredアノテーションとともに@InjectMocksを使用する方法

私は自動配線で3つの異なるクラスを使用しているクラスAを持っています

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}

それらをテストしている間、私はモックとして2つのクラス(BとC)のみを持ち、通常の実行としてクラスDを自動配線したいのですが、このコードは私のために機能していません:

@RunWith(MockitoJUnitRunner.class)
public class aTest () {

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}

そうすることさえ可能ですか?

34
USer22999299

それは次のようなものでなければなりません

@RunWith(SpringJUnit4ClassRunner.class)
public class aTest () {

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @InjectMocks
    private A a;

}

DAutowiredにしたい場合は、Testクラスで何もする必要はありません。 AutowiredAには、Dの正しいインスタンスが必要です。また、Autowiringが正しく設定されている場合、contextConfigurationが機能するにはSpringJUnit4ClassRunnerを使用する必要があると思います。 MockitoJunitRunnerを使用していないため、mocksを自分で初期化する必要があります。

MockitoAnnotations.initMocks(Java.lang.Object testClass)

34
Sajan Chandran

私は同じ問題に直面していて、サジャン・チャンドランによる答えを試みました。私の場合、@ SpringBootTestアノテーションを使用してすべてのBeanのサブセットのみをロードするため、機能しませんでした。目標は、他の多くの依存関係と構成があるため、私がモックしているBeanをロードすることではありません。

そして、私は解決策の次のバリアントが私のために働くことを発見しました。これは通常の場合にも使用できます。

@RunWith(SpringRunner.class)
@SpringBootTest(classes={...classesRequired...})
public class aTest () {

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @Spy
    private D d;

    @InjectMocks
    private A a;

    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
    }

}
6
Thomas