私はTDDの基本原則に精通しています。
- テストを書く、これらは実装がないため失敗します
- テストに合格するための基本的な実装を作成する
- コードをリファクタリング
ただし、インターフェイスと実装がどこに適合するかについては少し混乱しています。私は暇なときにSpringWebアプリケーションを作成しています。そして、銃を燃やすのではなく、インターフェイス/実装をもう少しうまくテストする方法を理解したいと思います。ここで作成したこの簡単なサンプルコードを見てください。
public class RunMe
{
public static void main(String[] args)
{
// Using a dummy service now, but would have a real implementation later (fetch from DB etc.)
UserService userService = new DummyUserService();
System.out.println(userService.getUserById(1));
}
}
interface UserService
{
public String getUserById(Integer id);
}
class DummyUserService implements UserService
{
@Override
public String getUserById(Integer id)
{
return "James";
}
}
私はUserService
インターフェースを作成しました。最終的にはデータベースにクエリを実行する実際の実装がありますが、アプリケーションを稼働させるために、DummyUserService
今のところ静的データを返すだけの実装に置き換えました。
質問:上記のテスト戦略をどのように実装できますか?
と呼ばれるテストクラスを作成し、それDummyUserServiceTest
を呼び出すgetUserById()
と返されることをテストできますJames
。時間の無駄ではないにしても、かなり単純に見えます(?)。
その後、データベースからユーザー名を返すテストクラスRealUserService
を作成することもできます。getUserById()
これは私を少し混乱させる部分です。そうすることで、これは本質的に単体テストの境界を超えて、(DBにヒットした)統合テストのようになりませんか?
質問(少し改善されました):ダミー/スタブされたインターフェースと実際の実装を使用する場合、どの部分を単体テストする必要があり、どの部分を安全にテストしないでおくことができますか?
私は昨夜このトピックについてグーグルで数時間を過ごし、TDDとは何かに関するチュートリアル、またはJUnitの使用方法の例をほとんど見つけましたが、実際に何をテストすべきかをアドバイスする領域には何もありませんでした。しかし、私が十分に検索しなかったか、正しいものを探していなかった可能性は完全にあります...