1

私は Junit テストの初心者ですが、いくつかのコードをテストする必要があります。基本的なことはわかったと思いますが、まだ問題があり、インターネット上で何も見つかりませんでした。

テストしたいクラスは次のとおりです。

public static void methodToTest(Label l2, Label l3, User u) {


    int first = MyDB.someMethod(u.anotherMethod()).size();
    int second = MyDB.someOtherMethod(u).size();


    if (first == 1) {
        l2.setCaption("...");
    }

    ...
}

システムに「first」と「second」の整数を作成させたくありません。代わりに、コードの最後の行が正しく機能するかどうかをテストできるように、それらを「1」にしたいだけです。

MyDB は、静的メソッド (someMethod() および someOtherMethod()) を持つパブリック クラスです。

メソッド methodToTest をテストしたい。このメソッドを parms で呼び出そうとし、最後に変更された params を予想されるものと比較しました。

私は Mockito と PowerMockito を使用しています。

これは私の試みの1つです:

@PrepareForTest({ClassToTest.class, MyDB.class })
@RunWith(PowerMockRunner.class)
public class Test extends PowerMockTestCase{
   PowerMockito.mockStatic(MyDB.class);
   PowerMockito.doReturn(1).when(MyDB.someMethod(u.anotherMethod()).size());
   PowerMockito.doReturn(1).when(MyDB.someOtherMethod(u).size());
   ClassToTest.methodToTest(l1, l2, u);
   assertTrue(l1.equals(l3) && l2.equals(l4));
}

私が得る例外は、「when() に渡された引数はモックではありません!」です。

誰でも私を助けてくれることを願っています。この問題を解決するために何時間も費やしましたが、成功しませんでした。

ありがとうございました!!!

4

1 に答える 1

1

コメントで述べたように、静的メソッドがテストの妨げになっていることがわかりました。したがって、静的メソッドを避けることをお勧めします。あなたの例でそれがどのように見えるか見てみましょう:

テストする必要があるコードがいくつかあります..

public class ProductionClass {
  public static void methodToTest(Label l2, Label l3, User u) {
    int first = MyDB.someMethod(u.anotherMethod()).size();
    int second = MyDB.someOtherMethod(u).size();

    if (first == 1) {
        l2.setCaption("...");
    }

    ...
  }
}

まず最初に、プロダクション クラスの静的メソッドをインスタンス メソッドにします。

public class ProductionClass {
  public void methodToTest(Label l2, Label l3, User u) {  // removed "static"
    int first = MyDB.someMethod(u.anotherMethod()).size();
    int second = MyDB.someOtherMethod(u).size();

    if (first == 1) {
        l2.setCaption("...");
    }

    ...
  }
}

わかりました。MyDB の静的メソッドへの結合がまだあります。その 1 つの静的メソッドを取り除くことで、プロダクション クラスがよりテストしやすくなりました。方法は次のとおりです..次のようないくつかの抽出メソッドのリファクタリングを実行できます。

public class ProductionClass {
  public void methodToTest(Label l2, Label l3, User u) {
    int first = getFirst();
    int second = getSecond();

    if (first == 1) {
        l2.setCaption("...");
    }

    ...
  }

  int getFirst() {
    return MyDB.someMethod(u.anotherMethod()).size();
  }

  int getSecond() {
    return MyDB.someOtherMethod(u).size();
  }
}

これで、そのプロダクション クラスを簡単にサブクラス化し、使いたいメソッドをオーバーライド (または必要に応じて部分モック) できます。

public class TestableProductionClass extends ProductionClass {
  @Override
  int getFirst() {
    return 1;
  }

  @Override
  int getSecond() {
    return 1;
  }
}

必要以上に難しくすることはありませんし、PowerMock を導入すると、私が対処したくない複雑さが増す傾向があります。YMMV。幸運を!

于 2016-05-18T17:15:50.373 に答える