Dans un projet où je travaille, nous avons des services de dépistage Initialisation unité de la manière suivante:
- dépendances simulacres qui sont nécessaires pour le service.
- Créez le service en utilisant un constructeur.
Quelque chose comme ça :
@RunWith(SpringRunner.class)
public class ServiceTest extends AbstractUnitTest {
@Mock private Repository repository;
private Service service;
@Before
public void init() {
service = new Service(repository);
when(repository.findById(any(Long.class))).thenReturn(Optional.of(new Entity()));
}
}
Mais notre nouveau développeur proposé d'utiliser @Autowired
et@SpringBootTest
@SpringBootTest(classes = ServiceTest.class)
@MockBean(classes = Repository.class)
@RunWith(SpringRunner.class)
public class ServiceTest extends AbstractUnitTest {
@MockBean private Repository repository;
@Autowired private Service service;
@Before
public void init() {
when(repository.findById(any(Long.class))).thenReturn(Optional.of(new Entity()));
}
}
Avant cela, je suppose que @Autowired
et @SpringBootTest
doit être utilisé que dans les tests d'intégration. Mais googlé beaucoup et je vois que certaines personnes utilisent ces deux dans les tests unitaires. Je lis boot-fonctionnalités test . , Je lis aussi ce tests unitaires contre les tests d'intégration avec Spring . Pour moi, il se sent toujours bien doesn`t que nous devons impliquer printemps pour faire l' injection de dépendance pour les tests unitaires, comme nous pouvons le faire par nous - mêmes pour faire les tests unitaires. Alors, doit @Autowired
et @SpringBootTest
être utilisé dans les tests unitaires?
N ° A l' unité test est de tester un seul composant dans l' isolement. En utilisant l' injection de constructeur dans vos haricots vous permet d'appeler très simplement new SomeService(myMock)
, sans ressort nécessaire.
L' écriture des composants ou fonctionnels des tests (test de votre application , mais pas câbler à des services externes pour un test complet d'intégration, se moquant des interfaces uniquement externes, ce qui est bon pour des choses comme des tests MockMvc) est un bon match pour @SpringBootTest
, et dans ce cas , vous pourriez avoir besoin pour créer des objets fantaisie dans une configuration Spring et les lier automatiquement dans votre test afin que vous puissiez les manipuler.