Hi
I have written a simple Cache Controller Service, this Controller Service has a 
property which if populated allows the cache to be populated when it is 
intialized.  I have also written a simple processor that allows me to utilize 
the Controller Service and checks some of the preloaded values and also checks 
some of the cache methods.
I now want to write some Junit tests for my processor, and I want to 
instantiate my Cache Controller Service.  I have looked at other Junit test 
classes in the nifi-0.2.1 source release for some guidance on how to do this, 
looking particularly at the test classes for the DetectDuplicate processor.
I have imported the Controller Service API and based on what I saw in the 
DetectDuplicate tests I have created a test shown below:
public class TestCacheTester {
    
    @Test
    public void  checkCache() throws InitializationException, IOException {
        
        final TestRunner runner = TestRunners.newTestRunner(CacheTester.class);
        final StandardCacheService  testCache = createService();
        
        runner.addControllerService("my-cache", testCache );
        runner.enableControllerService(testCache);        
        runner.setProperty("Cache Service", "my-cache");        
        runner.enqueue(Paths.get("src/test/resources/hello.txt"));
        runner.run();        
    }
        
     private StandardCacheService createService() throws 
InitializationException {

            final StandardCacheService cacheService = new 
StandardCacheService();
            final ComponentLog logger = new MockProcessorLog("cacheService", 
cacheService);
            final MockControllerServiceInitializationContext clientInitContext 
= new                       
MockControllerServiceInitializationContext(cacheService, "cacheService", 
logger);
            cacheService.initialize(clientInitContext);

            return cacheService;
        }
         
     static final class StandardCacheService extends AbstractControllerService 
implements CacheServiceAPI {

         public static Map<String, String> cacheMap = new HashMap<String, 
String>();

            @Override
            public void onPropertyModified(final PropertyDescriptor descriptor, 
final String oldValue, final String                 newValue) {
            }

            @Override
            protected java.util.List<PropertyDescriptor> 
getSupportedPropertyDescriptors() {
                final List<PropertyDescriptor> props = new ArrayList<>();
                //props.add(StandardCacheService.DATAFILE);
                return props;
            } 
            
            @OnEnabled
            public void onConfigured(final ConfigurationContext context) throws 
InitializationException {
               // configContext = context;                
                initializeCache("/data/TEST_FILE");              
            }

            private void initializeCache(String fileName) {                
                try {
                    BufferedReader br = new BufferedReader(new 
FileReader(fileName));                    
                    String line = "";                    
                    while((line = br.readLine()) != null){                      
  
                        String [] values = line.split(",");
                        cacheMap.put(values[0], values[1]);
                    }                    
                    br.close();                    
                } catch (IOException e) {                    
                    System.out.println("IO Exception " + e);
                }               
            }
         
........ Plus other Cache Methods snipped for brevity................

My question is should I actually be importing my StandardCacheService  class 
and setting its property descriptor or is the above listing where I have 
effectively rewritten StandardCacheService class in the Junit Test Class the 
correct way of using a Controller Service in a Junit test?
If the former is correct how do I set the PropertyDescriptor as when I did try 
this option the StandardCacheService.DATAFILE PropertyDescriptor was never 
visible?
Many thanksDave


Reply via email to