質問編集履歴

2

書式改善

2021/10/14 04:49

投稿

chikara
chikara

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,34 @@
1
- 記事投稿Webアプリを自作しています。
1
+ 記事投稿Webアプリを自作しています。プログラミングの勉強し始めて1年ちょっとです。
2
2
 
3
3
  アイコン設定を実装したのですが、ダメもとで書いてみたコードでなぜか
4
4
 
5
- 正常に動作しています。(正常に動作しているのはありがたいのですが・・・)原因がわからず、テストコードを書いてみたら予想通りNullpointerException。テストの書き方違うのか、実装に問題があるのか教えていただきたいです
5
+ 正常に動作しています。(正常に動作しているのはありがたいのですが・・・)原因がわからず、テストコードを書いてみたら予想通りPersonControllerのedit()メソッドのif文内、person.getIcon_file()がNullなのでNullpointerExceptionが発生
6
+
7
+
8
+
6
-
9
+ テストではtestEditProfilePostSucccess()メソッド内の.andExpect(model().hasErrors)を.andExpect(status().isOk())にしてくれと言われるんですが、
10
+
11
+ 実際はmodel().hasErrors()にするとテストは正常に動作します。
12
+
13
+ 試しにPersonControllerのeditメソッドのbindingResult.hasErrors()をコメントアウトしてテストをすると
14
+
15
+ PersonControllerのperson.getIcon_file()がNullやから参照できません、と言われました。
16
+
17
+ Controllerの仕様は、return"redirect:/person/formなのでテストは.andExpect(status().isFound())になるはずです。
18
+
19
+
20
+
21
+ 解決したいことは、
22
+
23
+ ・そもそもアプリの動作が上手くいくのはどうしてか?(PersonControllerのedit()メソッドのperosn.getIcon_file()がNullなのでNullPointerExceptionが発生するのでは?)
24
+
25
+ ・(正常に動作しているので、実装が正しいと仮定して)テストはどう改善したら良いか
26
+
27
+
28
+
7
- プログラミングの勉強始めて1年ちょっとです。
29
+ 皆様、どうかご教授お願い致す。
30
+
31
+
8
32
 
9
33
  開発環境:Java 8
10
34
 
@@ -407,15 +431,3 @@
407
431
  }
408
432
 
409
433
  ```
410
-
411
- 上記テストではandExpect(status().isOk())にしてくれと言われるんですが、
412
-
413
- 実際はmodel().hasErrors()にするとテストは正常に動作してしまいます。
414
-
415
- 試しにPersonControllerのeditメソッドのbindingResult.hasErrors()をコメントアウトしてテストをすると
416
-
417
- person.getIcon_file()がNullやから参照できません、と言われました。
418
-
419
- Controllerの仕様的にstatus().isFound()になるはずと思うんですが、
420
-
421
- ご教授お願い致します。

1

書式の改善

2021/10/14 04:48

投稿

chikara
chikara

スコア6

test CHANGED
File without changes
test CHANGED
@@ -54,364 +54,360 @@
54
54
 
55
55
  private List<Blog> blogs;
56
56
 
57
+
58
+
59
+ @Service
60
+
61
+ public class PersonService {
62
+
63
+ @Autowired
64
+
65
+ private PersonRepository personRepository;
66
+
67
+
68
+
69
+ public Person createPerson() {
70
+
71
+ Person person=new Person();
72
+
73
+ person.setName("名前を設定してください");
74
+
75
+ personRepository.save(person);
76
+
77
+ return person;
78
+
79
+ }
80
+
81
+ public void updatePerson(Person person) {
82
+
83
+ personRepository.save(person);
84
+
85
+ }
86
+
87
+ }
88
+
89
+
90
+
91
+ @Controller
92
+
93
+ @RequestMapping("/person")
94
+
95
+ public class PersonController {
96
+
97
+ @Autowired
98
+
99
+ private PersonService personService;
100
+
101
+ @Autowired
102
+
103
+ private UserService userService;
104
+
105
+ //プロフィール編集
106
+
107
+ @GetMapping("/edit")
108
+
109
+ public String edit(Person person,Model model){
110
+
111
+ List<Blog> blogs=blogService.getMyBlogs(person);
112
+
113
+ model.addAttribute("blogs",blogs);
114
+
115
+ model.addAttribute("base64icon",person.getIcon_base64_str());
116
+
117
+ return"person/form";
118
+
119
+ }
120
+
121
+ @PostMapping("/edit")
122
+
123
+ public String edit(@Valid Person person,BindingResult bindingResult) {
124
+
125
+ if(bindingResult.hasErrors()) {
126
+
127
+ return"person/form";
128
+
129
+ }
130
+
131
+ if(!person.getIcon_file().isEmpty()) {
132
+
133
+ try {
134
+
135
+ MultipartFile file=person.getIcon_file();
136
+
137
+ StringBuffer data=new StringBuffer();
138
+
139
+ String base64=new String(Base64.encodeBase64(file.getBytes()),"ASCII");
140
+
141
+ data.append("data:image/jpeg;base64,");
142
+
143
+ data.append(base64);
144
+
145
+ person.setIcon_base64_str(data.toString());
146
+
147
+ }catch(Exception e) {
148
+
149
+ }
150
+
151
+ }
152
+
153
+ personService.updatePerson(person);
154
+
155
+ return"redirect:/person/index";
156
+
157
+ }
158
+
57
159
  ```
58
160
 
161
+ ```HTML
162
+
163
+ <!DOCTYPE html>
164
+
165
+ <html xmlns:th="http://www.thymeleaf.org"
166
+
167
+ xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
168
+
169
+ <head>
170
+
171
+ <meta charset="UTF-8">
172
+
173
+ <title>プロフィール編集</title>
174
+
175
+ </head>
176
+
177
+ <body>
178
+
179
+ <p>
180
+
181
+ <a class="return" href="/person/index">一覧に戻る</a>
182
+
183
+ </p>
184
+
185
+ <form th:action="@{/person/edit}" th:object="${person}" method="post" enctype="multipart/form-data">
186
+
187
+ <!-- アイコン未設定時 -->
188
+
189
+ <span th:if="${person.icon_base64_str eq null}">
190
+
191
+ アイコン設定
192
+
193
+ ファイルを選択してください
194
+
195
+ <input type="file" th:field="*{icon_file}">
196
+
197
+ </span>
198
+
199
+
200
+
201
+ <!-- アイコン設定時 -->
202
+
203
+ <span th:if="${person.icon_base64_str !=null}">
204
+
205
+ <img th:src="${base64icon}" style="width:100px; height:100px;-moz-border-radius: 50px;
206
+
207
+ -webkit-border-radius: 25px;border-radius: 50px;"><br>
208
+
209
+ アイコン編集
210
+
211
+ ファイルを選択してください
212
+
213
+ <input type="file" th:field="*{icon_file}">
214
+
215
+ </span>
216
+
217
+
218
+
219
+ <div>
220
+
221
+ 名前<br>
222
+
223
+ <input type="text" th:field="*{name}">
224
+
225
+ <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
226
+
227
+
228
+
229
+ </div>
230
+
231
+ <div>
232
+
233
+ <ul>
234
+
235
+ <li th:each="blog:${person.blogs}" th:object="${blog}">
236
+
237
+ <span th:text="*{title}"></span><br>
238
+
239
+ <span th:text="*{contents}"></span>
240
+
241
+ <a th:href="@{|/person/blog/*{id}/edit|}">編集</a>
242
+
243
+ </li>
244
+
245
+ </ul>
246
+
247
+ </div>
248
+
249
+ <div>
250
+
251
+ <input type="submit" value="編集">
252
+
253
+ </div>
254
+
255
+ </form>
256
+
257
+ </body>
258
+
259
+ </html>
260
+
261
+ ```
262
+
59
- ```Java
263
+ ```Java
60
-
264
+
61
- @Service
265
+ @WebMvcTest(PersonController.class)
62
-
266
+
63
- public class PersonService {
267
+ public class PersonControllerTest {
64
268
 
65
269
  @Autowired
66
270
 
67
- private PersonRepository personRepository;
68
-
69
-
70
-
71
- public Person createPerson() {
72
-
73
- Person person=new Person();
74
-
75
- person.setName("名前を設定してください");
76
-
77
- personRepository.save(person);
78
-
79
- return person;
80
-
81
- }
82
-
83
- public void updatePerson(Person person) {
84
-
85
- personRepository.save(person);
86
-
87
- }
88
-
89
- }
271
+ private MockMvc mockMvc;
272
+
273
+
274
+
275
+ @MockBean
276
+
277
+ private PersonService personService;
278
+
279
+ @MockBean
280
+
281
+ private BlogService blogService;
282
+
283
+ @MockBean
284
+
285
+ private CommentService commentService;
286
+
287
+ @MockBean
288
+
289
+ private UserService userService;
290
+
291
+ @MockBean
292
+
293
+ private UserDetailsManager manager;
294
+
295
+
296
+
297
+ private static UserAccount account;
298
+
299
+ private static Blog blog;
300
+
301
+ private static List<Blog> blogs;
302
+
303
+ private static Map<String, Comment> commentMap;
304
+
305
+
306
+
307
+ @BeforeEach
308
+
309
+ public void setUp() {
310
+
311
+ Person person1=new Person();
312
+
313
+ person1.setName("chikara");
314
+
315
+ account=new UserAccount();
316
+
317
+ account.setPerson(person1);
318
+
319
+ when(userService.find("user")).thenReturn(account);
320
+
321
+
322
+
323
+ Person person2=new Person();
324
+
325
+ person2.setName("minato");
326
+
327
+
328
+
329
+ blog=new Blog();
330
+
331
+ blog.setTitle("Spring");
332
+
333
+ blog.setContents("a");
334
+
335
+ blog.setPerson(person1);
336
+
337
+ blogs=Arrays.asList(blog);
338
+
339
+
340
+
341
+ commentMap=new HashMap<String, Comment>();
342
+
343
+
344
+
345
+ Comment comment1=new Comment();
346
+
347
+ comment1.setBlog(blog);
348
+
349
+ comment1.setPerson(person2);
350
+
351
+ comment1.setCommenting("11");
352
+
353
+ commentMap.put("1", comment1);
354
+
355
+
356
+
357
+ Comment comment2=new Comment();
358
+
359
+ comment2.setBlog(blog);
360
+
361
+ comment2.setPerson(person1);
362
+
363
+ comment2.setCommenting("22");
364
+
365
+ commentMap.put("2", comment2);
366
+
367
+ }
368
+
369
+ @TestConfiguration
370
+
371
+ static class Config implements WebMvcConfigurer{
372
+
373
+
374
+
375
+ @Override
376
+
377
+ public void addFormatters(FormatterRegistry registry) {
378
+
379
+ registry.addConverter(String.class,Blog.class,id->blog);
380
+
381
+ registry.addConverter(String.class,Person.class,id->account.getPerson());
382
+
383
+ registry.addConverter(String.class,Comment.class,id->commentMap.get(id));
384
+
385
+ }
386
+
387
+ }
388
+
389
+      @Test
390
+
391
+ @WithMockUser(roles="USER")
392
+
393
+ public void testEditProfilePostSucccess() throws Exception{
394
+
395
+ MultiValueMap<String, String> params=new LinkedMultiValueMap<>();
396
+
397
+ params.add("name", "chikara");
398
+
399
+ params.add("birthday", "1990-1-1");
400
+
401
+ params.add("icon_file", "picture.jpg");
402
+
403
+ mockMvc.perform(post("/person/edit").with(csrf()).params(params))
404
+
405
+ .andExpect(status().isFound());
406
+
407
+ }
90
408
 
91
409
  ```
92
410
 
93
- ```Java
94
-
95
- @Controller
96
-
97
- @RequestMapping("/person")
98
-
99
- public class PersonController {
100
-
101
- @Autowired
102
-
103
- private PersonService personService;
104
-
105
- @Autowired
106
-
107
- private UserService userService;
108
-
109
- //プロフィール編集
110
-
111
- @GetMapping("/edit")
112
-
113
- public String edit(Person person,Model model){
114
-
115
- List<Blog> blogs=blogService.getMyBlogs(person);
116
-
117
- model.addAttribute("blogs",blogs);
118
-
119
- model.addAttribute("base64icon",person.getIcon_base64_str());
120
-
121
- return"person/form";
122
-
123
- }
124
-
125
- @PostMapping("/edit")
126
-
127
- public String edit(@Valid Person person,BindingResult bindingResult) {
128
-
129
- if(bindingResult.hasErrors()) {
130
-
131
- return"person/form";
132
-
133
- }
134
-
135
- if(!person.getIcon_file().isEmpty()) {
136
-
137
- try {
138
-
139
- MultipartFile file=person.getIcon_file();
140
-
141
- StringBuffer data=new StringBuffer();
142
-
143
- String base64=new String(Base64.encodeBase64(file.getBytes()),"ASCII");
144
-
145
- data.append("data:image/jpeg;base64,");
146
-
147
- data.append(base64);
148
-
149
- person.setIcon_base64_str(data.toString());
150
-
151
- }catch(Exception e) {
152
-
153
- }
154
-
155
- }
156
-
157
- personService.updatePerson(person);
158
-
159
- return"redirect:/person/index";
160
-
161
- }
162
-
163
- ```
164
-
165
- ```HTML
166
-
167
- <!DOCTYPE html>
168
-
169
- <html xmlns:th="http://www.thymeleaf.org"
170
-
171
- xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
172
-
173
- <head>
174
-
175
- <meta charset="UTF-8">
176
-
177
- <title>プロフィール編集</title>
178
-
179
- </head>
180
-
181
- <body>
182
-
183
- <p>
184
-
185
- <a class="return" href="/person/index">一覧に戻る</a>
186
-
187
- </p>
188
-
189
- <form th:action="@{/person/edit}" th:object="${person}" method="post" enctype="multipart/form-data">
190
-
191
- <!-- アイコン未設定時 -->
192
-
193
- <span th:if="${person.icon_base64_str eq null}">
194
-
195
- アイコン設定
196
-
197
- ファイルを選択してください
198
-
199
- <input type="file" th:field="*{icon_file}">
200
-
201
- </span>
202
-
203
-
204
-
205
- <!-- アイコン設定時 -->
206
-
207
- <span th:if="${person.icon_base64_str !=null}">
208
-
209
- <img th:src="${base64icon}" style="width:100px; height:100px;-moz-border-radius: 50px;
210
-
211
- -webkit-border-radius: 25px;border-radius: 50px;"><br>
212
-
213
- アイコン編集
214
-
215
- ファイルを選択してください
216
-
217
- <input type="file" th:field="*{icon_file}">
218
-
219
- </span>
220
-
221
-
222
-
223
- <div>
224
-
225
- 名前<br>
226
-
227
- <input type="text" th:field="*{name}">
228
-
229
- <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
230
-
231
-
232
-
233
- </div>
234
-
235
- <div>
236
-
237
- <ul>
238
-
239
- <li th:each="blog:${person.blogs}" th:object="${blog}">
240
-
241
- <span th:text="*{title}"></span><br>
242
-
243
- <span th:text="*{contents}"></span>
244
-
245
- <a th:href="@{|/person/blog/*{id}/edit|}">編集</a>
246
-
247
- </li>
248
-
249
- </ul>
250
-
251
- </div>
252
-
253
- <div>
254
-
255
- <input type="submit" value="編集">
256
-
257
- </div>
258
-
259
- </form>
260
-
261
- </body>
262
-
263
- </html>
264
-
265
- ```
266
-
267
- ```Java
268
-
269
- @WebMvcTest(PersonController.class)
270
-
271
- public class PersonControllerTest {
272
-
273
- @Autowired
274
-
275
- private MockMvc mockMvc;
276
-
277
-
278
-
279
- @MockBean
280
-
281
- private PersonService personService;
282
-
283
- @MockBean
284
-
285
- private BlogService blogService;
286
-
287
- @MockBean
288
-
289
- private CommentService commentService;
290
-
291
- @MockBean
292
-
293
- private UserService userService;
294
-
295
- @MockBean
296
-
297
- private UserDetailsManager manager;
298
-
299
-
300
-
301
- private static UserAccount account;
302
-
303
- private static Blog blog;
304
-
305
- private static List<Blog> blogs;
306
-
307
- private static Map<String, Comment> commentMap;
308
-
309
-
310
-
311
- @BeforeEach
312
-
313
- public void setUp() {
314
-
315
- Person person1=new Person();
316
-
317
- person1.setName("chikara");
318
-
319
- account=new UserAccount();
320
-
321
- account.setPerson(person1);
322
-
323
- when(userService.find("user")).thenReturn(account);
324
-
325
-
326
-
327
- Person person2=new Person();
328
-
329
- person2.setName("minato");
330
-
331
-
332
-
333
- blog=new Blog();
334
-
335
- blog.setTitle("Spring");
336
-
337
- blog.setContents("a");
338
-
339
- blog.setPerson(person1);
340
-
341
- blogs=Arrays.asList(blog);
342
-
343
-
344
-
345
- commentMap=new HashMap<String, Comment>();
346
-
347
-
348
-
349
- Comment comment1=new Comment();
350
-
351
- comment1.setBlog(blog);
352
-
353
- comment1.setPerson(person2);
354
-
355
- comment1.setCommenting("11");
356
-
357
- commentMap.put("1", comment1);
358
-
359
-
360
-
361
- Comment comment2=new Comment();
362
-
363
- comment2.setBlog(blog);
364
-
365
- comment2.setPerson(person1);
366
-
367
- comment2.setCommenting("22");
368
-
369
- commentMap.put("2", comment2);
370
-
371
- }
372
-
373
- @TestConfiguration
374
-
375
- static class Config implements WebMvcConfigurer{
376
-
377
-
378
-
379
- @Override
380
-
381
- public void addFormatters(FormatterRegistry registry) {
382
-
383
- registry.addConverter(String.class,Blog.class,id->blog);
384
-
385
- registry.addConverter(String.class,Person.class,id->account.getPerson());
386
-
387
- registry.addConverter(String.class,Comment.class,id->commentMap.get(id));
388
-
389
- }
390
-
391
- }
392
-
393
-      @Test
394
-
395
- @WithMockUser(roles="USER")
396
-
397
- public void testEditProfilePostSucccess() throws Exception{
398
-
399
- MultiValueMap<String, String> params=new LinkedMultiValueMap<>();
400
-
401
- params.add("name", "chikara");
402
-
403
- params.add("birthday", "1990-1-1");
404
-
405
- params.add("icon_file", "picture.jpg");
406
-
407
- mockMvc.perform(post("/person/edit").with(csrf()).params(params))
408
-
409
- .andExpect(status().isFound());
410
-
411
- }
412
-
413
- ```
414
-
415
411
  上記テストではandExpect(status().isOk())にしてくれと言われるんですが、
416
412
 
417
413
  実際はmodel().hasErrors()にするとテストは正常に動作してしまいます。