Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

JavaOneMoreThing


Un peu de Java et plus encore

Daiquiri : résolution de l'année

Non ma résolution de l’année n’est pas de boire des cocktails daiquiri !

Pour cette année 2013, je me suis donné comme résolution de commencer un projet personnel open source. Je ne veux pas avoir trop d’ambition pour ce projet, l’idée est de surtout expérimenter la mise en place une usine logicielle avec les outils "cloud" d’aujourd’hui : github, cloudbees.

Pourquoi Daiquiri ? C’est le nom de la librairie utilitaire pour les tests unitaires, que je vous propose. Vous allez me dire mais il y en a déjà plein ! Oui c’est vrai mais avec cette librairie je veux proposer des solutions à des problèmes bien précis là où les autres s’arrêtent.

J’ai donc commencé une première implémétation de Daiquiri, en solutionnant un premier problème :

  • comment moquer la factory de javax.naming.InitialContext pour vos tests unitaires ?

Exemple :

package org.daiquiri.examples;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class LicenseChecker {
	static final String MAX_LICENSE = "MAX_LICENSE";
    private int currentNbUsers = 0;

    public LicenseChecker(int nbUsers) {
    	currentNbUsers = nbUsers;
    }

    public boolean canAddUsers(int nbNewUsers) throws NamingException {
    	Integer maxLicense = (Integer) new InitialContext().lookup(MAX_LICENSE);
        return currentNbUsers + nbNewUsers <= maxLicense;
    }
}

Les frameworks de mock classiques ne savent pas faire simplement, voici la Solution avec Daiquiri :

package org.daiquiri.examples;

import static org.daiquiri.Daiquiri.Naming.*;
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.naming.InitialContext;

public class LicenseCheckerTest {
	LicenseChecker checker = new LicenseChecker(10);

    @Test
    public void can_add_users_return_true() throws Exception{
    	InitialContext mockContext = mockInitialContext();
        mockContext.bind(LicenseChecker.MAX_LICENSE, new Integer(15));
        Assert.assertTrue(checker.canAddUsers(4));
    }

    @Test
    public void can_add_users_return_false() throws Exception{
    	InitialContext mockContext = mockInitialContext();
        mockContext.bind(LicenseChecker.MAX_LICENSE, new Integer(15));
        Assert.assertFalse(checker.canAddUsers(6));
    }
}

Vous pouvez trouver les sources sous mon repository github :

Et un projet d’examples :

La site de Daiquiri toujours en utilisant github (branche gh-pages du projet) :

L’intégration continue est sous BuildHive, proposé gratuitement par Cloudbees et qui est permet en click de mettre son projet sous une version simplifiée de Jenkins adaptée pour github. (Kohsuke en avait parlé à la jenkins conférence en avril l’année dernière) :

J’utilise un repository d’artefacts gratuit avec mon compte Cloudbees :

Et voici les lignes à mettre dans votre pom.xml, pour la version actuelle daiquiri-0.2 :

	<dependency>
    	<groupId>org.daiquiri</groupId>
        <artifactId>daiquiri</artifactId>
        <version>0.2</version>
        <scope>test</scope>
    </dependency>
    <repository>
    	<id>binout-cloudbees-release</id>
        <name>binout-cloudbees-release</name>
        <url>https://repository-binout.forge.cloudbees.com/release/</url>		</repository>

Et bien sûr, tout est open source sous licence Apache.

Si vous avez des idées pour les prochaines versions, n’hésitez pas à me contacter sur twitter @binout

Bon cocktail !


Discussions