@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がスローされるためです。
ここで何が欠けていますか?
私が答えたと思います:@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]
コメントを追加