Ce TD vise
Si vous dépassez le temps passez à la suite et revenez dessus plus tard. L'énoncé suivant est issu du “getting started” de easyMock mis à jour pour travailler avec junit 5 et voir un peu plus de choses.
public interface Collaborator { // if the document already exists, a "AlreadyAdded" exception is thrown. // if the document fails to be added, false is return. public boolean documentAdded(String title) throws AlreadyAdded ; public void documentRemoved(String title) ; }
Et l'exception associée :
public class AlreadyAdded extends Exception { }
public class ClassTested { public static final String COPY = "_copy"; private Collaborator listener; private HashMap<String, String> documents = new HashMap<>(); public void setListener(Collaborator listener) { this.listener = listener; } public void addDocument(String title, String document) { try { if (listener.documentAdded(title) ) documents.put(title, document); } catch (AlreadyAdded e) { documents.put(title+COPY, document); } } public void removeDocument(String title) { listener.documentRemoved(title); } public Collaborator getListener() { return listener; } public boolean isContained(String key) { return documents.containsKey(key); } }
import static org.easymock.EasyMock.*; import static org.junit.Assert.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.easymock.EasyMockSupport; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class ExampleTest extends EasyMockSupport { @TestSubject private ClassTested classUnderTest = new ClassTested(); // 2 @Mock private Collaborator mock; // 1 @BeforeEach public void setUp() { //5.a mock = mock(Collaborator.class); classUnderTest = new ClassTested(); classUnderTest.setListener(mock); }
@Test public void testRemoveNonExistingDocument() { // This call should not lead to any notification // of the Mock Object replay(mock); // 6.b classUnderTest.removeDocument("Does not exist"); }
java.lang.AssertionError: Unexpected method call Collaborator.documentRemoved("Does not exist"):...
@Test public void testRemoveNonExistingDocument2() { mock.documentRemoved("Does not exist"); //7.a replay(mock); //7.b classUnderTest.removeDocument("Does not exist"); //7.c verify(mock); //7.d }
@Test public void testAddDocument() throws AlreadyAdded { //Initialisation Collaborator firstCollaborator = mock(Collaborator.class);//construction de mock Collaborator secondCollaborator = mock(Collaborator.class);//construction de mock, il ne sera pas utilisé classUnderTest.setListener(firstCollaborator); //// expect document addition expect(firstCollaborator.documentAdded("New Document")).andReturn(true); //On attend que le mock réponde True ! replayAll(); //on enregistre le comportement de tous les Mocks classUnderTest.addDocument("New Document", "content"); assertTrue(classUnderTest.isContained("New Document")); //on vérifie que NOS codes se comportent correctement verifyAll(); //On vérifie le comportement de tous les mocks }
@Test public void testFailingAddDocument() throws AlreadyAdded { //Initialisation Collaborator firstCollaborator = mock(Collaborator.class); Collaborator secondCollaborator = mock(Collaborator.class); classUnderTest.setListener(firstCollaborator); //// expect document addition expect(firstCollaborator.documentAdded("New Document")).andReturn(false); replayAll(); classUnderTest.addDocument("New Document", "content"); assertFalse(classUnderTest.isContained("New Document")); verifyAll(); }
@Test public void testDuplicationWhenAddingDocument() throws AlreadyAdded { //Initialisation Collaborator firstCollaborator = mock(Collaborator.class); Collaborator secondCollaborator = mock(Collaborator.class); classUnderTest.setListener(firstCollaborator); //// expect document addition expect(firstCollaborator.documentAdded("New Document")).andThrow(new AlreadyAdded()); replayAll(); classUnderTest.addDocument("New Document", "content"); assertTrue(classUnderTest.isContained("New Document"+ClassTested.COPY)); verifyAll(); }
Cela conclut la partie tutorielle. A présent, vous devriez savoir créer vous même des tests d'intégration.
Vous devez réaliser en groupe de X étudiants un jeu de quizz dont voici la spécification.
Voici les interfaces qui vous sont données et que vous devez respecter.
public interface GameInterface { void startGame(); boolean isNotOver(); String nextQuestion(); boolean setCurrentUserAnswer(String answer); String getRightAnswer(); int getPoints(); }
public interface QuizInterface { public String getQuestion(int currentQuestionNumber) ; public boolean isGoodAnswer(int currentQuestionNumber, String answer); public String getAnswer(int currentQuestionNumber); public int size(); public void addQuestion(QuestionInterface q1); }
public interface QuestionInterface { String getAnswer(); String getQuestion(); boolean isGoodAnswer(String answer); }
Voici un code pour tester un jeu.
package quizzPK; import java.util.Scanner; public class mainTestGame { public static void main(String[] args) { Scanner sc = new Scanner(System.in); QuizInterface quiz = new Quiz(); QuestionInterface q1 = new Question("Capitale de la France ?", "Paris"); QuestionInterface q2 = new Question("Capitale de l'Allemagne ?", "Berlin"); QuestionInterface q3 = new Question("Capitale de l'Italie", "Rome"); quiz.addQuestion(q1); quiz.addQuestion(q2); quiz.addQuestion(q3); GameInterface game = new Game(quiz); game.startGame(); while (game.isNotOver()) { System.out.println(game.nextQuestion() + " : ") ; String answer = sc.nextLine(); boolean valid = game.setCurrentUserAnswer(answer); if (!valid ) { System.out.println("You failed, the correct answer is : " + game.getRightAnswer() ); } else System.out.println("Well done ! "); } System.out.println("Score : " + game.getPoints()); } }
Game
sans développer la classe Quiz
.Game
en utilisant des Mocks.Quizz
sans développer la classe Question
.Quizz
en utilisant des MocksL'essentiel n'est pas d'atteindre cette ultime étape. Mais davantage d'apprendre à écrire des tests d'intégration.