[過去ログ]
カプセル化■プライベートメソッドをテストする方法 (476レス)
カプセル化■プライベートメソッドをテストする方法 http://mevius.5ch.net/test/read.cgi/tech/1593949666/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
1: デフォルトの名無しさん [sage] 2020/07/05(日) 20:47:46.60 ID:M+BkbwUs ■短い回答 プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう ■これに対する(変な人の)驚いた反論 プライベートを一時的にパブリックにして、テストが終わったら プライベートに戻すなんてやるわけないだろw ↑誰もそんなコトしろなんて言ってない ■テスト専門家による回答 t-wadaのブログ https://t-wada.hatenablog.jp/entry/should-we-test-private-methods 短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。 ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。 プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。 プライベートなメソッドのテストに関しては、4つの考え方があります。 ・パブリックメソッド経由でテストする ・別クラスのパブリックメソッドとする ・テスト対象の可視性を(やや)上げる ・プライベートのまま、リフレクションでアクセスしてテストを書く パブリックメソッド経由でテストする 多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。 別クラスのパブリックメソッドとする プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。 テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。 http://mevius.5ch.net/test/read.cgi/tech/1593949666/1
2: デフォルトの名無しさん [sage] 2020/07/05(日) 20:48:27.27 ID:M+BkbwUs 前スレ カプセル化の有害性、オブジェクト指向は愚かな考え https://mevius.5ch.net/test/read.cgi/tech/1592491656/ http://mevius.5ch.net/test/read.cgi/tech/1593949666/2
3: デフォルトの名無しさん [sage] 2020/07/05(日) 20:51:53.15 ID:M+BkbwUs クソコード例。こんなコード書いてるやつが、privateのテストで パブリックに変更してテストするのはおかしいとか言ってる(笑) lenが配列(笑)理由 int型にはnullが入れられないから(笑) https://mevius.5ch.net/test/read.cgi/tech/1592491656/805 ずれるかもしれないが下のような場合、privateにnullを突っ込んだらヌルポだが privateをわざわざコード弄ってまで別にテストするようなことは少なくとも ビジネスソフトでは知ってる限り無い。組み込みとかは知らんし必要ならやれば良いけど。 class ChinTester { public void testChin(int[] len) { if (len==null){System.out.println("You are a woman"); return;} if (len.length<11){ uncS(len);} else{funcB(len);} return;} private void funcS(int[] len){ if (len.length<9){System.out.println("Smallest"); }else{System.out.println("Smaller");} return;} private void funcB(int[] len){ if (len.length<14){System.out.println("Medium");} else if (len.length<16){System.out.println("Bigger"); }else{ System.out.println("Wow!");} return;} } http://mevius.5ch.net/test/read.cgi/tech/1593949666/3
4: デフォルトの名無しさん [sage] 2020/07/05(日) 20:53:33.00 ID:M+BkbwUs 983 名前:デフォルトの名無しさん[] 投稿日:2020/07/05(日) 14:18:27.81 ID:9F15TCk0 [68/74] 正直あの短さでOOかどうかと(スタティックでインスタンス化もないコードだが)言うのは 不毛だけどID:JiRnWiGCの組み込みおじさんのがOO感はあるよ。 で、staticで出されてもprivateのテストがどうかと言う話には全く寄与しないわけだが、 じゃあ逆に、>>805のチンコテストのfuncSとfuncBはどうやってテストするの? パブリック経由で全パターンと言うことならこれでこの話はおしまい。 パブリック経由でやりましょう。 違うと言うなら具体的にコードでおながいします。 http://mevius.5ch.net/test/read.cgi/tech/1593949666/4
5: デフォルトの名無しさん [sage] 2020/07/05(日) 20:54:53.36 ID:M+BkbwUs >>4への回答 設計に問題があるので、コードを修正しましょう。 修正すれば自然とpublicになります↓ 926 名前:デフォルトの名無しさん[] 投稿日:2020/07/05(日) 12:20:23.64 ID:MQ9nuMmc [21/53] >>805 こう書いた方が良いと思うの https://paiza.io/projects/mPhqBnYZnQukkW6HY9LmOQ http://mevius.5ch.net/test/read.cgi/tech/1593949666/5
6: デフォルトの名無しさん [sage] 2020/07/05(日) 20:57:49.33 ID:M+BkbwUs >>5の補足、これはまだプライベートですが 普通はMainクラスにコードをごちゃごちゃ書かないので judgeLengthを含むクラスを作成します。 そしてmainから呼び出します。 必然的にjudgeLengthメソッドはパブリックになります。 http://mevius.5ch.net/test/read.cgi/tech/1593949666/6
9: デフォルトの名無しさん [sage] 2020/07/05(日) 21:07:40.54 ID:M+BkbwUs >>7 微妙でもなんでもねーよ Mainクラスに関係ない処理を入れるな これは小さいサンプルだが、大きくなった時 Mainクラスに、そんな処理はいってたらおかしいだろ なんで(大きくなったコードの)その他の部分は別のクラスにあるのに この処理だけMainクラスにあるんだ?って http://mevius.5ch.net/test/read.cgi/tech/1593949666/9
11: デフォルトの名無しさん [sage] 2020/07/05(日) 21:11:26.55 ID:M+BkbwUs >>10 Mainクラスと関係ある処理だから? じゃあ名前が悪いよね。 誰が「Mainクラス」と聞いて その中にある処理を想像できるんだ?w http://mevius.5ch.net/test/read.cgi/tech/1593949666/11
15: デフォルトの名無しさん [sage] 2020/07/05(日) 21:14:43.14 ID:M+BkbwUs >>12 だから分けろって。設計がおかしいだろ。 Mainクラスにメインの処理を入れるな 設計が悪いって言ってるのになんで理解できない? http://mevius.5ch.net/test/read.cgi/tech/1593949666/15
16: デフォルトの名無しさん [sage] 2020/07/05(日) 21:15:37.89 ID:M+BkbwUs プライベートをテストしたいっていうのは 本質的に設計が悪いってことが理解できないやつ もしくは設計なんてしたことがないやつなんだろう http://mevius.5ch.net/test/read.cgi/tech/1593949666/16
18: デフォルトの名無しさん [sage] 2020/07/05(日) 21:16:23.44 ID:M+BkbwUs >>17 だからやるのが正解だろw http://mevius.5ch.net/test/read.cgi/tech/1593949666/18
24: デフォルトの名無しさん [sage] 2020/07/05(日) 21:22:53.14 ID:M+BkbwUs Mainに他のクラスの処理を全て同居させる 全部Mainにあるから呼び出せるよね?と publicメソッドをprivateメソッドに変更 publicメソッドはMainのみ! と言い あぁ、プライベートメソッドのテストができない〜と嘆く(笑) アホなのか?自分でテストできないようにクソ設計に変更して 自業自得じゃんw http://mevius.5ch.net/test/read.cgi/tech/1593949666/24
27: デフォルトの名無しさん [sage] 2020/07/05(日) 21:25:44.19 ID:M+BkbwUs おそらく設計とは何かを知らずに、 ただ動けばいいと思ってるんだろう テストしやすく設計するのも 設計の一つ http://mevius.5ch.net/test/read.cgi/tech/1593949666/27
29: デフォルトの名無しさん [sage] 2020/07/05(日) 21:26:36.76 ID:M+BkbwUs >>26 だからテストしやすようにjudgeLengthメソッドを含んだ クラスを作るだけ http://mevius.5ch.net/test/read.cgi/tech/1593949666/29
30: デフォルトの名無しさん [sage] 2020/07/05(日) 21:27:04.67 ID:M+BkbwUs >>28 勘違いしてませんが? Main関数とロジックを同居させるなの意味がわかりませんか? http://mevius.5ch.net/test/read.cgi/tech/1593949666/30
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.239s*