2 votes

S'il vous plaît traduire ceci en gardant les mêmes balises HTML s'il y en a : Classe de cas fictive en scala : Mockito

Dans mon application play, je compte simuler une classe de cas. Je suis capable de le faire mais cela crée un objet avec toutes les variables membres nulles. Y a-t-il un moyen de créer des objets mock des classes de cas de sorte que l'objet puisse avoir certains membres initialisés?

case class User(name: String, address: String)    
val mockUser = mock[User]
user.name // null
user.address //null

comment créer un mockUser de sorte que je puisse assigner des valeurs à name et address?

Éditer:

J'ai besoin de la capacité de simuler l'objet car je veux avoir un comportement prédéfini d'une des méthodes membres. (Cette méthode membre appelle un service externe et je ne veux pas l'appel du service externe lors de l'exécution d'un test unitaire.) La méthode membre est appelée à l'intérieur d'une autre méthode membre, que je veux tester.

6voto

Dima Points 7274

Vous ne devriez jamais avoir besoin de simuler des classes de cas. C'est comme "simuler un entier".

Qu'est-ce qui ne va pas avec val mockUser = User("mockName", "mockAddress")?

5voto

Nick Points 3318

Il devrait être aussi simple que cela:

when(mockUser.name).thenReturn("Bob")

Jusqu'à présent:

Vous ne devriez jamais avoir besoin de simuler des classes de cas. C'est comme "simuler un entier".

Faux. (À mon avis)

Qu'est-ce qui ne va pas avec val mockUser = User("mockName", "mockAddress")?

Rien si vous ne pensez qu'il n'y a rien de mal avec

val mockFoo = FooWith20Properties("1", "2", "3",..."20")

Vos tests fonctionneront mais vous avez manqué le point d'utiliser un framework de simulation pour réduire le code redondant de vos tests.

Cela dit, il semble y avoir un clivage entre ceux qui pensent que les classes de cas devraient être finales et ceux qui ne le pensent pas. Si vous marquez les vôtres comme finales, alors la simulation ne fonctionnera pas sans recourir à quelque chose d'aussi controversé que Powermock.

0voto

Jeremy Townson Points 23

Je déplacerais votre appel à un service externe en dehors de la classe de cas, dans une classe de service et je mockerais ensuite cette classe de service.

En général, les classes de cas représentent des données. Le code est plus propre lorsque les données et les fonctions qui utilisent ces données (par exemple, votre appel externe) sont séparées.

Je rédigerais du code comme suit

case class User(nom: String, adresse: String)

class UserService {
  def callExternalService(user: User): Résultat = ???
}

val testUser = User("quelqu'un", "quelque part")
val mockService = mock[UserService]
when(mockService.callExternalService(testUser)).thenReturn(...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X