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?
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 Autowired
A
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)
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);
}
}