0

PowerMockなどを使用してスタブ化せずに、SomeClassでオンザフライで作成されたこのValueObjectをテストするにはどうすればよいですか?

class ValueOBject {
    private String x, y;
    getters
    setters
}
class SomeClass {
    public void  foo () {
       ValueObject vo = new ValueObject();
       vo.setX("some string 1");
       vo.setY("some string 2");

       faa(vo);
    }

    public void faa(ValueObject vo) {
        // do some more logic on vo here
    }
}


class SomeClassTest extends TestCase{
   public void testFoo() {
       SomeClass s = new SomeClass();
       s.foo();
       // HOW TO DO THIS?
       verify(faa(VAlueObject that is created during foo's run));
   }
}

PowerMockito または同様のライブラリを使用して MOCKED オブジェクトを返したくありません! むしろ、メソッド foo() の実行中に作成される REAL オブジェクト:

//    DONT WANT A MOCKED OBJECT
//    @Mock
//    private ValueOBject vo;
//     henNew(GetEmailInformation.class).withNoArguments().thenReturn(getEmailInformation);
4

4 に答える 4

1

したがって、 ?で作成されfoo()て渡されたValueObjectに対してアサートしたいようです。faa(vo)

単体テストを作成すると、期待されるValueObjectがインスタンス化され、に渡されfaa(vo)ます。次に、この結果を、を呼び出したときに発生する結果と比較しますfoo()

例えば:

// in your unit test:
ValueObject testVo = new ValueObject();
// set values as needed
// testVo should represent what you expect the ValueObject instantiated by foo to 
// hold *before* it gets passed to faa

faa(testVo);
// assertions against results of faa method

foo();
// assertions *comparing* the results of foo with the results of your manual faa

したがって、たとえば、fooX=1およびY=1のValueObjectを作成しfaa、ValueObjectの最終結果がX=-1およびY=2になるようにそれらに魔法をかける場合、単体テストは次のようになります。このような:

ValueObject testVo = new ValueObject();
testVo.setX(1);
testVo.setY(1);

faa(testVo);
// assertions using your testing library of choice to verify getX() returns -1 and
// getY() returns 2

foo();
// assertions that the end values after foo()'s faa call are -1 and 2 respectively

上記のダミーの例では、fooとはどちらfaaもvoidメソッドであるため、戻り値はありません。私はそれがfaa実際にテスト可能な何かをすることを想定しています-例えばフィールドの設定、値の変更など。

他の回答に残したいくつかのコメントで、いくつかのプライベートおよび/または保護されたフィールドとメソッドが関係していることに注意しました。この場合、これらの値を取得する方法についてJavaリフレクションを調べる必要があります。

foo()ただし、に渡される前にインスタンス化されたValueObjectを具体的にリッピングするfaa(vo)場合、これは不可能です。上で説明したように、最善の策は、作成されると予想されるValueObjectの動作の期待をテストし、渡された結果を実際に発生するものfoo()と比較することです。faa(vo)

于 2012-06-08T17:42:52.263 に答える
1

ValueObject は内部で作成されるため、オブジェクトの状態にのみ依存できます。内部をテストする必要はありません。実行する呼び出しの副作用をテストするだけで済みます。

この場合、foo が何をするかを知っているので、foo をテストする必要はありません。これは faa の単なるラッパーです。したがって、グローバル状態と ValueObject 入力によって引き起こされるアクションと副作用について faa をテストする必要があります。

foo() が期待どおりに動作することをテストしたい場合は、foo() が引き起こす副作用が faa(expectedObject) と同じであることをテストする必要があります。

言い換えれば、foo と faa が public であり、public インターフェースが foo が固定パラメーターを持つ faa のラッパーであると言う場合、foo が期待する固定パラメーターで faa とまったく同じように動作することをテストする必要があります。

于 2012-06-08T17:04:20.767 に答える
0

faa()in でのテストを検討することをお勧めしfoo()ます。OOP の観点から言えば、存在すらfoo()知る必要のない呼び出し元の方が望ましいと言えます。公開する必要はありますかfaa()faa()

于 2012-06-08T17:03:54.763 に答える
0

これは、設計が密結合であるため、代わりにオブジェクトをメソッドに挿入する可能性があることを示しています。

于 2012-06-08T16:56:29.757 に答える