@Test
public void pluginPipeline() {

    Store store = mock(Store.class);
    ScannerContext scannerContext = new ScannerContextImpl(store, OUTPUT_DIRECTORY);
    when(store.create(any(Class.class))).thenAnswer((Answer<Descriptor>) invocation -> {
        Class<? extends Descriptor> descriptorType = (Class<? extends Descriptor>) invocation.getArguments()[0];
        return mock(descriptorType);
    });
    when(store.addDescriptorType(any(Descriptor.class), any(Class.class))).thenAnswer((Answer<Descriptor>) invocation -> {
        Class<? extends Descriptor> descriptorType = (Class<? extends Descriptor>) invocation.getArguments()[1];
        return mock(descriptorType);
    });
    Map<String, ScannerPlugin<?, ?>> scannerPlugins = new HashMap<>();
    scannerPlugins.put("TestScanner", new TestItemScannerPlugin());
    scannerPlugins.put("DependentTestScanner", new DependentTestItemScannerPlugin());
    scannerPlugins.put("NestedTestScanner", new NestedTestItemScannerPlugin());
    doReturn(scannerPlugins).when(scannerPluginRepository).getScannerPlugins(scannerContext, emptyMap());
    Scanner scanner = new ScannerImpl(new ScannerConfiguration(), emptyMap(), scannerContext, scannerPluginRepository);
    Descriptor descriptor = scanner.scan(new TestItem(), "/", DefaultScope.NONE);
    assertThat(descriptor, instanceOf(DependentTestItemDescriptor.class));
    verify(store).create(eq(TestItemDescriptor.class));
    verify(store).addDescriptorType(any(TestItemDescriptor.class), eq(NestedTestItemDescriptor.class));
    verify(store).addDescriptorType(any(NestedTestItemDescriptor.class), eq(DependentTestItemDescriptor.class));
}