je rencontre un moment difficile à déterminer comment aborder un problème avec les tests unitaires. J'ai peu ou pas d'expérience en «tests unitaires». J'essaye de changer le classUnderTest seulement si absolument nécessaire avec des changements minimes. J'utilise JUnit 4, et je suis prêt à essayer d'utiliser Mockito, JMockit ou d'autres bibliothèques qui aideraient à tester efficacement et efficacement les unités. J'utilise JDBC pour la base de données.Comment Java Test Unit d'une classe complexe
Problème:
Dans le ClassUnderTest, je suis accès à une base de données statique . J'essaie d'utiliser des cas de test unitaires avec une config valide et une config invalide. Quelle est la bonne façon d'aborder ce problème?
Quelques possibles solutions que j'ai fait des recherches sont:
- D'une certaine façon en passant, ou 'injecter' un ObjectXResult faux de classe ObjectX
- Mock une base de données (si même possible avec statique référence db, utilisez une servlet de test unitaire distincte faisant référence à une fausse classe SpecializedDao?)
- Utilisez Mockito avec injectMocks, espion, lorsque (methodcallwithparameters) thenReturn résultat, ou une autre mise en œuvre Mockito fournit.
- Ouvert à toute autre solution.
Problème:
Dans le ClassUnderTest, je me sers un autre traitement complexe class2 qui fait beaucoup de travail comme ceci:
result = class2.execute(x, x, x, x, x, x);
class2-t traiter des choses et renvoie un résultat ENUM ou quelques exceptions. Comment puis-je gérer cela avec garder le champ de ce test unitaire spécifique sur ClassUnderTest. class2 accède à la base de données, et fait beaucoup de travail qui est la raison pour laquelle il est sa propre classe, mais je pense que les trois cas de test final dépendent du traitement pour tester soigneusement ClassUnderTest.
Merci pour porter avec moi, j'ai essayé de faire de la question avec autant de clarté que possible.
Il semble que vous ayez quelques couches à tester ici. Au sein de mon organisation, nous utilisons une architecture comme couche de service (qui appelle la couche dao) et une couche de dao (qui appelle réellement les appels jdbc). En ce qui concerne les tests unitaires, pensez à séparer votre classe de junits par classe. Donc pour votre couche de service qui fait la «logique métier» réelle, vous pouvez utiliser quelque chose comme EasyMock pour simuler les appels DAO. Cela vous permettrait d'isoler la logique spécifique à votre couche de service. Pour votre couche DAO, vous pouvez envisager d'utiliser quelque chose comme une base de données intégrée (DERBY) que vous testez par rapport à – Jason
Si vous ne pouvez absolument pas modifier la classe, PowerMockito vous permet de vous moquer des méthodes statiques. Mais j'ai tendance à considérer la nécessité d'utiliser PowerMockito comme un échec de conception - la testabilité aurait dû être l'un des critères de conception en premier lieu. –