2008-10-20 23 views
10

Tengo un método estático en mi código que me gustaría burlar de alguna manera.jmock burlarse de un método estático

Estoy usando jmock.

Una forma en la que supongo que podría hacer esto es tener una "clase contenedora" alrededor del método estático y simular esto pero esperaba una solución mejor.

Voy por esto de la manera incorrecta?

REACCIÓN:

que iba a tener una interfaz y la clase que tenía un método que acaba de llamar al método estático. Me permitiría burlarme de la lógica simplemente burlando la llamada a esta clase contenedora. (Me siento sucio, incluso hablando de ello :))

+0

Consulte la pregunta relacionada [Cómo simular con métodos estáticos] (http://stackoverflow.com/questions/153048/how-to-mock-with-static-methods). – flicken

Respuesta

7

No admitimos el uso de métodos estáticos en jMock porque no se ajusta a nuestro enfoque de diseño. Preferimos no usar métodos estáticos para funciones significativas que puedan afectar el estado del sistema. Tendemos a usarlos solo para admitir el código OO y hacerlo más legible. Es por eso que vemos burlarse de los métodos estáticos como una pista de que hay un problema. Una excepción es cuando está en una biblioteca de un tercero, pero probablemente lo envolveremos en algo más orientado a objetos de todos modos.

2

Powermock es una extensión de EasyMock que permite la burla de los métodos estáticos.

5

JMockit es otro conjunto de herramientas que permite la burla de métodos estáticos (así como los métodos finales, constructores, etc.).

No veo ningún problema con el juicioso uso de métodos estáticos al diseñar una solución de OO.

Por ejemplo, un patrón/idioma que me gusta usar es el fachada estática, particularmente para proporcionar una API más simple y fácil de usar al subsistema de persistencia en una aplicación comercial. En mi opinión, no hay otra solución más elegante que algo como:


    List<Person> peopleAboveAge = 
     find("select p from Person p where p.age >= ?", age); 

donde el método find ha sido importada de forma estática de una clase PersistenceFacade que define sólo los métodos estáticos, y encapsula cómo obtener la Sesión instancia apropiada/EntityManager. Esta solución es amigable y flexible para las pruebas unitarias. Lo usé en una aplicación comercial que tenía más de 500 entidades persistentes, usando Hibernate. La fachada estática nos ayudó cuando migramos de Hibernate 2 a Hibernate 3, cuando migramos de Oracle a Sybase y luego de regreso a Oracle, y cuando comenzamos a usar las anotaciones JPA en lugar de los archivos "hbm.xml" para la asignación de ORM.

Cuestiones relacionadas