Activité : Réaliser un type enregistrement

Consigne

Lire la capsule de théorie et prendre connaissance de l’activité avant de commencer la mise en route et de réaliser les tâches demandées.

Le code des tests unitaires doit être utilisé tel quel et ne doit pas être modifié. Le travail est individuel. Vous pouvez communiquer, mais en respectant le code d’honneur.

Situation

Vous êtes affecté à un projet de logiciel de gestion de références bibliographiques. On vous charge de réaliser un type Book et un module BookOperation avec des sous-programmes pour la manipulation de ce type. Vous recevez des tests unitaires en guise de spécification pour le type et pour les sous-programmes à réaliser. Le code de la figure 1 contient les tests pour le constructeur de classe Book et le code de la figure 2 contient les tests pour les sous-programmes de la classe BookOperations.

En observant le test du constructeur de la classe Book dans la classe BootTest, vous apprenez que le constructeur de la classe ne prend qu’un seul paramètre (le titre du livre). Le test vous renseigne également sur le nom et le type de toutes les variables membres (champs) de ce type composé ainsi que sur les valeurs que celles-ci doivent avoir après l’exécution du constructeur.

De même, en observant les tests de la classe BookOperations dans BookOperationsTest, vous apprenez ce que doit faire chacun des sous-programmes (notamment grâce au commentaire) et quelles sont les signatures de ces sous-programmes :

  • public static String getTitle(Book b)
  • public static String getAuthor(Book b)
  • public static void setAuthor(Book b, String firstname, String lastname)
  • public static String getYear(Book b)
  • public static void setYear(Book b, String year)
  • public static String getPublisher(Book b)
  • public static void setPublisher(Book b, String publisher)
  • public static String getIsbn(Book b)
  • public static void setIsbn(Book b, String isbn)
  • public static int getNumOfPages(Book b)
  • public static void setNumOfPages(Book b, int numOfPages)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ch.epai.ict.m404.activity5;

import org.junit.*;

public class BookTest {

    /**
     * Le constructeur de la classe Book affecte la valeur passée en paramètre à 
     * la variable membre title et initialise toutes les autres variables membres 
     * de type chaîne avec une chaîne vide.
     */
    @Test
    public void constructor_TitleValue_AllValuesInitialized() {
        Book b = new Book("The Java Language Specification");

        Assert.assertEquals(
            "La variable membre title n'est pas correctement initialisée.",
            "The Java Language Specification", b.title);

        Assert.assertEquals(
            "La variable membre authorFirstname n'est pas correctement initialisée.", 
            "", b.authorFirstname);

        Assert.assertEquals(
            "La variable membre authorLastname n'est pas correctement initialisée.",
            "", b.authorLastname);

        Assert.assertEquals(
            "La variable membre isbn n'est pas correctement initialisée.", 
            "", b.isbn);

        Assert.assertEquals(
            "La variable membre numOfPages n'est pas correctement initialisée.", 
            0, b.numOfPages);
            
        Assert.assertEquals(
            "La variable membre publisher n'est pas correctement initialisée.", 
            "", b.publisher);

        Assert.assertEquals(
            "La variable membre year n'est pas correctement initialisée.", 
            "", b.year);
    }
}
Fig. 1 – Tests de la classe Book
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
package ch.epai.ict.m404.activity5;

import org.junit.*;

public class BookOperationsTest {

    /**
     * La fonction getTitle doit renvoyer la valeur de la variable membre title.
     */
    @Test
    public void getTitle_ReturnTitle() {
        Book b;
        String expected;
        String actual;

        b = new Book("The Java Language Specification");
        actual = BookOperations.getTitle(b);
        expected = "The Java Language Specification";

        Assert.assertEquals("La fonction getTitle ne renvoie pas la bonne valeur.", expected, actual);

        b = new Book("The Java Virtual Machine Specification"); 
        actual = BookOperations.getTitle(b);
        expected = "The Java Virtual Machine Specification";
        
        Assert.assertEquals("La fonction getTitle ne renvoie pas la bonne valeur.", expected, actual);
    }



    /**
     * La fonction getAuthor doit renvoyer uniquement le nom de l'autheur si le
     * prénom est vide.
     */
    @Test
    public void getAuthor_NoFirstname_ReturnLastname() {
        Book b = new Book("The Java Language Specification");
        
        b.authorLastname = "Gosling";

        String actual = BookOperations.getAuthor(b);
        String expected = "Gosling";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La fonction getAuthor doit renvoyer l'initiale du prénom suivi du nom.
     */
    @Test
    public void getAuthor_FirstnameAndLastname_ReturnFirstnameInitialAndLastname() {
        Book b = new Book("The Java Language Specification");

        b.authorFirstname = "James";
        b.authorLastname = "Gosling";

        String actual = BookOperations.getAuthor(b);
        String expected = "J. Gosling";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setAuthor doit affecter la valeur de chaque paramètre à la
     * variable membre correspondante.
     */
    @Test
    public void setAuthor_NonNullValues_SetValue() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setAuthor(b, "James", "Gosling");

        Assert.assertEquals(
            "La variable membre authorFirstname n'a pas la bonne valeur.", 
            "James", b.authorFirstname);
            
        Assert.assertEquals(
            "La variable membre authorLastname n'a pas la bonne valeur.",
            "Gosling", b.authorLastname);
    }

    /**
     * La procédure setAuthor doit affecter la valeur de chaque paramètre à la
     * variable membre correspondante. Si un paramètre a la valeur null,
     * la procédure doit affecter une chaîne vide à la variable membre
     * correspondante.
     */
    @Test
    public void setAuthor_FirstnameNull_SetFirstNameEmptyString() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setAuthor(b, null, "Gosling");

        Assert.assertEquals(
            "La variable membre authorFirstname n'a pas la bonne valeur.", 
            "", b.authorFirstname);
            
        Assert.assertEquals(
            "La variable membre authorLastname n'a pas la bonne valeur.",
            "Gosling", b.authorLastname);
    }

    /**
     * La procédure setAuthor doit affecter une chaîne vide à la variable membre
     * correspondante si le paramètre nom ou prénom a la valeur null.
     */
    @Test
    public void setAuthor_Null_SetEmptyString() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setAuthor(b, null, null);

        Assert.assertEquals("", b.authorFirstname);
        Assert.assertEquals("", b.authorLastname);
    }
    /**
     * La fonction getYear doit renvoyer la valeur de la variable membre year.
     */
    @Test
    public void getYear_ReturnYear() {
        Book b = new Book("The Java Language Specification");
        String actual;
        String expected;

        b.year = "2014";
        actual = BookOperations.getYear(b);
        expected = "2014";

        Assert.assertEquals(expected, actual);

        b.year = "2015";
        actual = BookOperations.getYear(b);
        expected = "2015";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setYear doit affecter la valeur du paramètre à la variable
     * membre year.
     */
    @Test
    public void setYear_NonNullValues_SetValue() {
        
        Book b = new Book("The Java Language Specification");

        BookOperations.setYear(b, "2014");
        String actual = b.year;
        String expected = "2014";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setYear doit affecter une chaine vide à la variable membre year
     * si le paramètre a la valeur null.
     */
    @Test
    public void setYear_Null_SetEmptyString() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setYear(b, null);
        String actual = b.year;
        String expected = "";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La fonction getPublisher doit renvoyer la valeur de la variable membre
     * publisher.
     */
    @Test
    public void getPublisher_ReturnPublisher() {
        Book b = new Book("The Java Language Specification");

        String actual;
        String expected;

        b.publisher = "Addison-Wesley Professional";
        actual = BookOperations.getPublisher(b);
        expected = "Addison-Wesley Professional";

        Assert.assertEquals(expected, actual);

        b.publisher = "Addison-Wesley";
        actual = BookOperations.getPublisher(b);
        expected = "Addison-Wesley";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setPublisher doit affecter la valeur du paramètre à la variable
     * membre publisher.
     */
    @Test
    public void setPublisher_NonNullValues_SetValue() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setPublisher(b, "Addison-Wesley Professional");
        String actual = b.publisher;
        String expected = "Addison-Wesley Professional";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setPublisher doit affecter une chaine vide à la variable membre
     * publisher si le paramètre a la valeur null.
     */
    @Test
    public void setPublisher_Null_SetEmptyString() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setPublisher(b, null);
        String actual = b.publisher;
        String expected = "";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La fonction getIsbn doit renvoyer la valeur de la variable membre isbn.
     */
    @Test
    public void getIsbn_ReturnIsbn() {
        Book b = new Book("The Java Language Specification");
        
        String actual;
        String expected;

        b.isbn = "978-0133900699";
        actual = BookOperations.getIsbn(b);
        expected = "978-0133900699";

        Assert.assertEquals(expected, actual);

        b.isbn = "978-0133900698";
        actual = BookOperations.getIsbn(b);
        expected = "978-0133900698";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setIsbn doit affecter la valeur du paramètre à la variable
     * membre isbn.
     */
    @Test
    public void setIsbn_NonNullValues_SetValue() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setIsbn(b, "978-0133900699");
        String actual = b.isbn;
        String expected = "978-0133900699";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setIsbn doit affecter une chaine vide à la variable membre isbn
     * si le paramètre a la valeur null.
     */
    @Test
    public void setIsbn_Null_SetEmptyString() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setIsbn(b, null);
        String actual = b.isbn;
        String expected = "";

        Assert.assertEquals(expected, actual);
    }

    /**
     * La fonction getNumOfPages doit renvoyer la valeur de la variable membre
     * numOfPages.
     */
    @Test
    public void getNumOfPages_ReturnValue() {
        Book b = new Book("The Java Language Specification");
        
        int actual;
        int expected;

        b.numOfPages = 792;
        actual = BookOperations.getNumOfPages(b);
        expected = 792;

        Assert.assertEquals(expected, actual);

        b.numOfPages = 798;
        actual = BookOperations.getNumOfPages(b);
        expected = 798;

        Assert.assertEquals(expected, actual);
    }

    /**
     * La procédure setNumOfPages doit affecter la valeur du paramètre à la variable
     * membre numOfPages.
     */
    @Test
    public void setNumOfPages_SetValue() {
        Book b = new Book("The Java Language Specification");

        BookOperations.setNumOfPages(b, 798);
        int actual = b.numOfPages;
        int expected = 798;

        Assert.assertEquals(expected, actual);
    }
}
Fig. 2 – Tests de la classe BookOperations

Résultat attendu

Un projet Maven avec contenant les classes suivantes :

  • Book
  • BookOperations
  • BookTest
  • BookOperationsTest

Objectifs

À la fin de ce travail, vous devez :

  1. Connaître les notions de type simple et de type composé.
  2. Connaître la notion de variable membre.
  3. Connaître la notion d’instanciation (création d’un objet) et la syntaxe de l’opération d’instanciation en Java.
  4. Connaître la notion de référence à un objet.
  5. Être capable de repérer les informations utiles dans les tests unitaires.

Ressources

Logiciel :

  • Maven
  • Visual Studio Code

Documents :

Mise en route

Pour commencer, vous devez créer un projet Maven pour cette activité. Rendez-vous dans le répertoire de vos projets et lancez la commande suivante :

1
mvn archetype:generate -DgroupId=ch.epai.ict.m404.activity5 -DartifactId=activity5 -DarchetypeArtifactId=archetype-quickstart-jdk8 -DarchetypeGroupId=com.github.ngeor -DinteractiveMode=false

Déplacez-vous dans le répertoire activity5 et lancer la commande code . pour ouvrir le projet dans VSC (Visual Studio Code).

À vous de jouer !

Tâche

  1. Réaliser les classes demandées.

Demandez de l’aide en cas de besoin, mais essayez d’abord par vous-même et respectez toujours le code d’honneur !