Springユニットテスト:@SpyBeanを使用してvoidメソッドをモックする:代わりに@Mockを使用しない限り、そのBeanのNullPointerExceptionを取得する

heug:

@SpyBeanまたは@MockBeanが他のすべてのテストで機能しているため、このテストで機能するようにしています。ここでの唯一の違いは、このテストは一部のAWSライブラリを模倣しているため、アクティブなプロファイルを使用することです

SpyBeanを使用している場合は、クラスをインスタンス化する必要はありません。以下の私のような、無数の例が正常に機能しているようです。

私がテストしているユニット:

@Component
public class SqsAdapter {

    @Autowired
    QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    MyProcessor processor;

    @SqsListener("${queue.name}")
    public void onEvent(String message) {
        if (!StringUtils.isEmpty(message)) {
            processor.process(message);
        } else { 
            log.error("Empty or null message received from queue");
        }
    }
}

そして、process(...)が呼び出されることを期待する単純な単体テスト:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@ActiveProfiles("local")
public class SqsAdapterTest {

    @Autowired
    AmazonSQSAsync amazonSQS;

    @SpyBean
    MyProcessor processor;

    @InjectMocks
    SqsAdapter adapter;

    @Test
    public void testOnEvent() {
        doNothing().when(processor).process(any()); // <---- process() is void
        String event = "royale with cheese";
        adapter.onEvent(event);
        verify(processor, times(1)).process(event);
    }
}

単体テストでデバッグすると、初期化java.lang.NullPointerException processorれないかのようにオンになります。

iveも同じ結果で@MockBeanに切り替えてみました

さらに、@ SpringBootTestと@ActiveProfilesのテストも削除してみました。AmazonSQSAsyncの依存関係を削除しました。これは、リスナー自体をモックしていないため、同じNPEがスローされるためです。

ここで何が欠けていますか?

heug:

私が答えたと思います:@InjectMocksアノテーションを@SpyBeanと混合することでテストフレームワークを混合しているためと思われます...私がMockitoモックを使用しないようにしようとしていたので、これはMockitoアノテーションであると思いますテストを台無しにする

ワーキングユニットテストは次のようになります。

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("local")
public class SqsAdapterTest {

    @Autowired
    AmazonSQSAsync amazonSQS;

    @SpyBean
    SeamEventProcessor seamEventProcessor;

    @Autowired
    SqsAdapter adapter;

    @Test
    public void testOnEvent() {
        doNothing().when(seamEventProcessor).process(any());
        String event = "royale with cheese";
        adapter.onEvent(event);
        verify(seamEventProcessor, times(1)).process(event);
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ