1. ホーム
  2. java

[解決済み] Mockito - メソッドのスタブ時にNullpointerExceptionが発生する。

2022-02-03 03:26:40

質問

そこで私は、Java-Springプロジェクトのテストを書き始めました。

使っているのはJUnitとMockitoです。when()...thenReturn()オプションを使うと、サービスをシミュレートせずにモック化できるらしい。そこで、私がしたいことは、設定することです。

when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)  

しかし、どのwhen-clauseを実行しても、いつもNullpointerExceptionが発生します。もちろん、inputがnullなので、それは理にかなっています。

また、あるオブジェクトから別のメソッドをモックしようとしたとき。

when(object.method()).thenReturn(true)

メソッドが変数を必要とし、それが設定されていないため、そこでもNullpointerを取得します。

しかし、この変数の作成などを回避するために when().thenReturn() を使いたいのです。どのクラスがこのメソッドを呼び出しても、何があってもtrueか上記のリストを返すようにしたいだけなのです。

私の基本的な誤解なのか、それとも他に何か問題があるのでしょうか?

コードです。

public class classIWantToTest implements classIWantToTestFacade{
        @Autowired
        private SomeService myService;

        @Override
        public Optional<OutputData> getInformations(final InputData inputData) {
            final Optional<OutputData> data = myService.getListWithData(inputData);
            if (data.isPresent()) {
                final List<ItemData> allData = data.get().getItemDatas();
                    //do something with the data and allData
                return data;
            }

            return Optional.absent();
        }   
}

そして、これが私のテストクラスです。

public class Test {

    private InputData inputdata;

    private ClassUnderTest classUnderTest;

    final List<ItemData> allData = new ArrayList<ItemData>();

    @Mock
    private DeliveryItemData item1;

    @Mock
    private DeliveryItemData item2;



    @Mock
    private SomeService myService;


    @Before
    public void setUp() throws Exception {
        classUnderTest = new ClassUnderTest();
        myService = mock(myService.class); 
        classUnderTest.setService(myService);
        item1 = mock(DeliveryItemData.class);
        item2 = mock(DeliveryItemData.class);

    }


    @Test
    public void test_sort() {
        createData();
        when(myService.getListWithData(inputdata).get().getItemDatas());

        when(item1.hasSomething()).thenReturn(true);
        when(item2.hasSomething()).thenReturn(false);

    }

    public void createData() {
        item1.setSomeValue("val");
        item2.setSomeOtherValue("test");

        item2.setSomeValue("val");
        item2.setSomeOtherValue("value");

        allData.add(item1);
        allData.add(item2);


}

解決方法は?

まだスタブしていないメソッドのデフォルトの戻り値は false はブーリアンメソッド、コレクションやマップを返すメソッドは空のコレクションやマップ、そして null それ以外の場合は

内のメソッド呼び出しにも適用されます。 when(...) . この例では when(myService.getListWithData(inputData).get()) はNullPointerExceptionを引き起こします。 myService.getListWithData(inputData)null - は、以前にスタブされたことがない。

ひとつの方法として、すべての中間返り値に対してモックを作成し、使用前にスタブしておくという方法があります。例えば

ListWithData listWithData = mock(ListWithData.class);
when(listWithData.get()).thenReturn(item1);
when(myService.getListWithData()).thenReturn(listWithData);

あるいは、モックを作成する際に別のデフォルトアンサーを指定し、 メソッドが null ではなく新しいモックを返すようにすることもできます。 RETURNS_DEEP_STUBS

SomeService myService = mock(SomeService.class, Mockito.RETURNS_DEEP_STUBS);
when(myService.getListWithData().get()).thenReturn(item1);

のJavadocを読む必要があります。 Mockito.RETURNS_DEEP_STUBS には、より詳細な説明と使用上の警告が書かれています。

お役に立てれば幸いです。ただ、あなたのサンプルコードには、assertやverify文が抜けていたり、モック上でセッターを呼び出している(これは何の効果もない)など、さらに問題があるようなので注意してください。