2

クラス (「ClassUnderTest」としましょう) と特定のライブラリ クラス (「ヘルパー」と呼びましょう) の使用を単体テストしようとしています。そのため、モック化されたヘルパーを ClassUnderTest に挿入し、Expectations を使用してチェックしています。

 public class TestUseOfHelper {
     @Autowired ClassUnderTest classUnderTest;
     @Mocked    HelperClass    helper;
 [...]
     @Before
     public void setUp() throws Exception {
         Deencapsulation.setField(classUnderTest, "helper", helper);
     }
 [...]
     @Test
     public void test() {
         new Expectations() {{
             helper.doSomething(any);
         }};

         classUnderTest.useHelper();
    }

ここまでは順調ですね。

他のテスト (同じパッケージ、異なるファイル) では、ClassUnderTest の他の側面をテストしており、ヘルパーにその機能を実行させたいだけです。

 public class TestOtherQualities {
     @Autowired ClassUnderTest classUnderTest;
 [...]
     @Test
     public void test() {
        result = classUnderTest.processSomething();
        assertNonNull(result);
    }

これらのテストも問題なく動作します。

一連のテストを実行すると、問題が発生します。さて、2 番目のセットは失敗します。これは明らかに、モック ヘルパーがまだ配置されているためです!

完全なスイートが同じ JVM で実行され、Spring が 1 つの ClassUnderTest を作成し、指示どおりにモックを注入すると仮定しますが、次のテストには同じ ClassUnderTest オブジェクトを再利用するだけです。それらを別々に保つにはどうすればよいですか?個別のテスト ファイルごとに「新しい」オブジェクトを取得するにはどうすればよいですか? 私が取得していない/グーグルしているものは何ですか?

私は、Expectations ブロック内でオブジェクトを定義し、@Tested/@Injected を使用してさまざまなバリエーションを試しましたが、うまくいきませんでした。ところで、他のテストでヘルパーを嘲笑することは避けています。また、ClassUnderTest は一連の他のオブジェクトを自動配線し、それがさらに他のオブジェクトを自動配線するため、ClassUnderTest が参照するすべてのものをモックすることは実際的ではありません。

何か洞察がありますか、知識豊富なスタック オーバーフロー マジック 8 ボールですか? (「後で試す」は使用できません。)

4

2 に答える 2

2

テストクラスにアノテーションを付ける

@DirtiesContext(classMode = AFTER_CLASS)

テスト クラス間でアプリ コンテキストをリセットする場合。

于 2013-04-19T23:01:47.950 に答える
2

単体テストです。そのため、Spring を使用してオブジェクトを作成および自動配線しないでください。必要になるたびに新しい ClassUnderTest を作成し、モックの依存関係を手動で注入するだけです:

@Before
public void setUp() {
    this.classUnderTest = new ClassUnderTest();
    Deencapsulation.setField(classUnderTest, "helper", mockHelper);
}

注: 私は JMockit を知りません。新しいものを作成し、モックの依存関係を自動的に注入する注釈が含まれている可能性があります。私の答えの要点は、Spring は単体テストの対象外であるべきだということです。これが依存性注入の主な利点です。つまり、テストするオブジェクトのインスタンスを作成できることと、モック依存性を手動で注入できることです。

于 2013-04-19T21:55:45.243 に答える