3

ねえ、私はMockitoとTestNGを使用して、サービスに対して多くの外部呼び出しを行うクラスの単体テストを作成しています。実際、これはまったく新しいので、ネット上のドキュメントがほとんどないようです。問題。

私のテストは基本的にこのように見えます

@Test
public class ClassToTestTest{

@Mock
private Object1 object1;

@Mock
private Object2 object2;

@InjectMocks
private ClassToTest classToTest;

public void test1(){
    classToTest.methodToTest();

}
...
...
}

実際のクラスは以下の通りです

import FinalClass;

public class ClassToTest{

private Object1 object1;
private Object2 object2;

public void methodToTest(){
    object2 = FinalClass.getObject2();

    ...
    ...
}

...
...
}

テストで作成したObject2のモックを返すためにFinalClass.getObject2()が必要です。PowerMockを使用してFinalClassをモックできることはわかっていますが、作成したclassToTestにそれを挿入する方法がわかりません。作成されたので、テストobject2からclassToTest.methodToTest()を実行すると、モックされた実装で初期化されます。

前もって感謝します!

4

1 に答える 1

4

PowerMockito で最終的な静的クラスをモックする場合に必要な注釈 @PrepareForTest と mockStatic() の使用がありません。final static混乱している可能性があるのは、クラスだけでなくクラスを扱っていることだと思います。finalそのため、注意が必要な追加のモック呼び出しがいくつかあります。

これらの実装クラスを考えると

/*
The final static class that's giving you all the mocking grief
*/
public final class FinalStaticClass {

    // this object instance "will not" be returned when we mock() the class
    private static MyObject obj = new MyObject();

    public static MyObject getMyObject() {
        return obj; 
    }
}

/*
A simple value object used by MyClass
*/
public class MyObject {

}

/*
The class you wish to test
*/
public class MyClass {

    private MyObject obj;

    public void methodToTest() {
        obj = FinalStaticClass.getMyObject();
        // do something
    }

    public MyObject getMyObject() {
        return obj;
    }
}

プロジェクトに必ず含めpowermock-mockito-1.4.10-full.jarてください。その後、このテストクラスを使用できます

import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;

import ...    

@RunWith(PowerMockRunner.class)
@PrepareForTest(FinalStaticClass.class)
public class MyClassTest{

    @Mock
    MyObject expectedObject;

    @InjectMocks
    MyClass myClass = new MyClass();

    @Test
    public void test1(){

        // mock all static methods
        mockStatic(FinalStaticClass.class);

        when(FinalStaticClass.getMyObject()).thenReturn(expectedObject);

        // execute the method under test
        myClass.methodToTest();

        assertEquals(expectedObject, myClass.getMyObject());

    }
}

expectedObjectこれは、テストで作成したモックであり、FinalStaticClass から返された実装ではないことがわかります。

于 2012-07-10T21:47:33.560 に答える