Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

Mocking: El comienzo

0 comentarios

Hace cuestión de un par de meses preparé un pequeño texto para dar una escueta charla alrededor del concepto de mock y técnicas básicas de mocking, la idea era que un equipo de programadores tuviera un primer contacto para la creación de tests unitarios donde el codigo a probar tiene una dependencia con clases externas.

Claramente hay montones de artículos, textos, papers, tutoriales, ... en internet que cuentan el mismo problema que estamos tratando en este artículo, sin embargo, puede ser que siempre le pueda servir de ayuda a aquellos programadores que van a enfrentarse con el mismo tipo de problema, y otro ejemplo más siempre ayuda a comprender mejor cómo aplicar la solución.

Cuando como programadores nos enfrentamos por primera vez a la creación de tests unitarios para el código que estamos programando, uno de los problemas complicados es el de comprender cómo crear tests unitarios para aquellas clases que tienen dependencias con clases externas, ya que una de las primeras ideas que se nos ocurren es, la de probar conjuntamente la o las clases dependientes, a la vez que la clase que inicialmente teníamos en mente. Esto contradice la definición de test unitario, donde se pretende crear tests para una única unidad, en este caso hablamos de una clase sin tener que probar el codigo de clases dependientes. Si la clase sobre la que estamos trabajando y creando los tests unitarios depende de otras clases, por definicion sabemos el comportamiento de las clases dependientes, sabemos de antemano, por la definicion o especificacion dedicha clase la salida para una determinada entrada en cada uno de sus metodos que la componen.


Tomando como ejemplo de lo comentado el esquema anterior, nuestra idea es crear tests unitarios para la clase Navigator, la cual hace uso internamente de NavigatorFlow y NavigatorListener. Dado que inicialmente no hemos creado interfaz para NavigatorFlow (INavigatorFlow), la clase Navigator hace uso directo de NavigatorFlow, lo que obliga que al ejecutar los tests que escribimos de Navigator se ejecute el codigo de NavigatorFlow, lo que ademas de agregar complejidad a los tests unitario, estamos probando dos unidades en lugar de una.

Para evitar esta complejidad y hacer nuestras vidas mas fáciles como programadores, es preciso tener en cuenta a la hora de diseñar la jerarquia de clases, que creemos un interfaz para la clase NavigatorFlow y esta interfaz es la usada dentro de Navigator, de esta manera los tests unitarios que vamos a escribir serán menos complejos a la vez que nuestro codigo sera mas fáil de mantener y sencillo de entender por otros programadores.

Gracias a la creación de la interfaz INavigatorFlow, podemos en la clase que contiene los tests unitarios, definir un objecto mock (NavigatorFlowMock) usando dicha interfaz e inyectando dicho objeto mock en nuestra clase Navigator antes de ejecutar los tests unitarios. El objecto mock creado implementará la misma interfaz que NavigatorFlow (INavigatorFlow), lo que nos ayudara a definir la respuesta a la clase Navigator.

namespace MockingFirstExampleTest
{
    ///

    /// Unit tests for Navigator class.
    ///

    [TestClass]
    public class NavigatorTest
    {
        ///

        /// This is the instance of the class under test.
        ///
        private Navigator navigator;

        ///

        /// Mock object of NavigatorFlow.
        ///
        private Mock flowMock;

        [TestMethod]
        public void TestNavigateSuccess()
        {
            var input = "MyInput";
            var expectedOutput = input + input;

            // define expectations of the mock object
            flowMock.Setup(flow => flow.DoNext(input)).Returns(input + input);

            // call to navigate method
            var output = navigator.Navigate(input);

            // check expectations
            Assert.IsTrue(output.Equals(expectedOutput));
        }

        /// 
        /// Set up the common stuff for the unit tests.
        ///
        [TestInitialize]
        public void SetUp()
        {
            // create the mocks objects
            flowMock = new Mock();

            // instantiates the class under test
            navigator = new Navigator(flowMock.Object);
        }
    }
}
 

El código anterior define una clase de tests unitarios para la clase Navigator, dicha clase contiene una instancia a Navigator y otra que es el objeto mock de la clase NavigatorFlow (flowMock). En el método SetUp, el cual se ejecuta antes de cada test unitario, lo que necesitamos es instanciar el objeto mock e inyectar éste mismo en el objeto de Navigator.

Asimismo, en los test unitarios (TestNavigateSuccess) se configura el comportamiento del mock, en este ejemplo se indica que el objeto mock va a recibir una llamada a DoNext con una entrada determinada, y le indicamos la salida (Returns) de dicha llamada. En este caso estamos haciendo uso de una librarías de mocking existente, hay montones de librerías que nos facilitan la vida para aplicar estas técnicas, además, se pueden definir varias salidas y distintos comportamientos en nuestros objetos mock, solo es necesario conocer la librería que vamos a usar. También es posible crear el objeto mock sin librerías pero nos obligará a escribir algo de cødigo en una clase aparte, sin embargo, hay circunstancias donde es mejor esta práctica que el uso de una librería.
Read On

FX con Java

0 comentarios

Pues con esto vamos a comenzar las nuevas entradas. Hace como un par de semanas me topé con un par de palabras que rezaban Java FX que llamaron mi atención. No es que haya investigado mucho sobre el tema, pero parece tener buena pinta.

Java FX es un lenguage de script para crear interfaces de usuario, sirve tanto para web como aplicaciones de escritorio o móviles. Si os gusta el diseño de GUIs o programar aplicaciones de escritorio, echarle un vistazo, porque parece ser interesante.

Hay algunas demos por la red que tienen buena pinta, pero lo interesante sería realizar algún pequeño ejemplo para ver la dificultad que implica tener una interfaz gráfica bien vistosa, así que cuando haga algo con esto ya os comentaré. Por el momento os recomiendo el blog de Chris Oliver en su parte de Java FX.
Read On

Los huevos de pascua....

0 comentarios

... En muchas ocasiones, no paramos de sorprendernos de algunas cosas. Eso mismo me ocurrió hace un par de días cuando instalando una aplicación con la herramienta apt-get vi al final de la pantalla de ayuda, la frase "Este APT tiene poderes de Super Vaca". Me llamó la atención porque nunca había visto esta frase usando dicha herramienta. Echando mano del google, vi una web donde comentaba que tecleando apt-get moo podríamos ver los poderes de Super Vaca.

Parece ser, por lo que he leído por ahí, que esto no es más que un Huevo de Pascua. En otras palabras, ordenes escondidas para mostrar algo con un toque de humor, o los nombres de los integrantes del equipo de desarrollo o lo que se le haya antojado a los programadores mostrar a los usuarios, pero nada más. No conocía la existencia de estos Huevos de Pascua, pero es algo que no deja de ser curioso, ese tipo de cosas en las que los programadores invierten el tiempo que sobra del desarrollo de una aplicación.

Por cierto, el huevo de apt-get moo es el dibujo de una vaca, podéis visualizarlo vosotros mismos.
Read On