Pregunta

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

Estoy usando jmock.

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

¿Estoy haciendo esto de forma incorrecta?

COMENTARIOS:

Iba a tener una interfaz y una clase que tenía un método que solo llamaba el método estático. Me permitiría burlarme de la lógica simplemente burlándose de la llamada a esta clase contenedora. (Me siento sucio incluso hablando de ello :))

¿Fue útil?

Solución

No admitimos métodos estáticos simulados en jMock porque no se ajusta a nuestro enfoque de diseño. Preferimos no utilizar métodos estáticos para características importantes que pueden afectar el estado del sistema. Tendemos a usarlos solo para admitir el código OO y hacerlo más legible. Es por eso que consideramos que la burla de un método estático sugiere que hay un problema. Una excepción es cuando está en una biblioteca de terceros, pero de todos modos, probablemente lo incluiremos en algo más orientado a objetos.

Otros consejos

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

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

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


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

donde el método find se importa estáticamente de una clase PersistenceFacade que define solo métodos estáticos, y resume cómo obtener la instancia de Session / EntityManager adecuada. Esta solución es de prueba unitaria amigable y flexible. Lo usé en una aplicación de negocios 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 volvimos a Oracle, y cuando comenzamos a usar las anotaciones JPA en lugar de " hbm.xml " archivos para mapeo ORM.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top