web-dev-qa-db-fra.com

Comment utiliser @InjectMocks avec l'annotation @Autowired dans Junit

J'ai une classe A qui utilise 3 classes différentes avec câblage automatique

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}

En les testant, j'aimerais avoir seulement 2 des classes (B & C) comme mocks et avoir la classe D pour être Autowired en fonctionnement normal, ce code ne fonctionne pas pour moi:

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

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}

Est-il même possible de le faire?

34
USer22999299

Cela devrait être quelque chose comme

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

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @InjectMocks
    private A a;

}

Si vous voulez que D soit Autowired, vous n'avez rien à faire dans votre classe Test. Votre AutowiredA doit avoir une instance correcte de D. Je pense aussi que vous devez utiliser SpringJUnit4ClassRunner pour que Autowiring fonctionne, avec contextConfiguration correctement défini. Parce que vous n'utilisez pas MockitoJunitRunner, vous devez initialiser votre mocks vous-même en utilisant

MockitoAnnotations.initMocks (Java.lang.Object testClass)

34
Sajan Chandran

J'étais confronté au même problème et j'ai essayé la réponse de Sajan Chandran. Cela n'a pas fonctionné dans mon cas, car j'utilise l'annotation @SpringBootTest pour charger uniquement un sous-ensemble de tous mes beans. Le but n'est pas de charger les beans dont je me moque car ils ont beaucoup d'autres dépendances et configurations.

Et j'ai trouvé la variante suivante de la solution qui fonctionnait pour moi, qui est également utilisable dans le cas normal.

@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