1

でテスト ケースを設計していJUnitます。私の質問は、クラス変数として宣言され、テスト内で初期化されたオブジェクトを保存する方法です。現在、そのような場合、私はjava.lang.NullPointerException.

以下は簡単な説明です-テストする必要がある以下の3つのサービスがあります-

  1. サービス 1 (ログイン):ユーザー名とパスワードのペアを受け入れ、応答として Cookie を返します。
  2. サービス 2 (postmessage):メッセージを受け入れます。メッセージには、リクエストで Cookie を指定する必要があり、投稿されたメッセージの一意の ID を返します。
  3. サービス 3(markasread) : メッセージ ID を受け入れます。この ID は Cookie で提供する必要があります。サービス 3 で使用する必要があるメッセージ ID は、サービス 2 によって返されます。

これは私が働くことを期待していたものです-

import static org.junit.Assert.*;
import org.junit.Test;

public class ProfileTest{
    private String cookie;
    private String messageId;

    @Test
    public void loginTest(){
        String username = "demouser";
        String password = "demopassword";

        HttpResponse response = login(username, password);
        cookie = response.getCookie();

        assertEquals(response.getResponse(), "success");
    }

    @Test
    public void postmessageTest(){
        String message = "Hi, this is test message";
        HttpResponse response = postmessage(message, cookie);
        messageId = response.getCookie();

        assertEquals(response.getResponse(), "success");
    }

    @Test
    public void markasreadTest(){
        HttpResponse response = markasread(messageId, cookie);

        assertEquals(response.getResponse(), "success");
    }
}
4

2 に答える 2

2

答えは、できませんし、すべきではありません。テスト ケースの各実行には、クラス変数の独自のコピーがあります。この背後にある考え方は、各テスト ケースを独立して実行し、互いに依存してはならないということです。

ジャンク コードを介して実行できる可能性がありますが、そのような推奨事項はありません。

可能であれば、テスケースを一緒にクラブにして、単一のものとして実行してみてください.

于 2013-08-08T09:15:45.943 に答える
1

それができない理由は、BlockJUnit4ClassRunner がリーフ メソッドごとにテスト クラスの新しいインスタンスを作成するためです。デフォルトのコンストラクターを使用してテスト クラスを構築します。

BlockJUnit4ClassRunner

関連するコードは

protected Object createTest() throws Exception {
    return getTestClass().getOnlyConstructor().newInstance();
}
于 2013-08-08T09:19:42.263 に答える