nifi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From DAVID SMITH <davidrsm...@btinternet.com>
Subject Re: Instantiating a Controller Service in a Junit test
Date Sun, 09 Aug 2015 21:06:18 GMT
Mark
Thanks for the reply, I have changed my test as you suggested, see below:
@Test
    public void checkCache() throws InitializationException, IOException{
        final TestRunner runner = TestRunners.newTestRunner(CacheTester.class);
        final StandardCacheService cacheService = new StandardCacheService();
        runner.addControllerService("my-cache", cacheService);
        runner.setProperty(cacheService, StandardCacheService.DATAFILE, "/data/TEST_FILE");
        runner.enableControllerService(cacheService);
        runner.run();
    }


When I run my test I now get a null pointer exception in my CacheTester class. It appears
the cache in my CacheTester class doesn't exist, when I comment out all the calls to the cache
methods the test passes.
If I understand the code above correctly I don't believe I have set the PropertyDescriptor
in my CacheTester processor class which is shown below has been set, am I correct?:
 public static final PropertyDescriptor CACHE_SERVICE = new PropertyDescriptor.Builder() 
   .name("Cache Service")     .description("The Controller Service to use in order to
obtain a Cache Service")     .required(false)     .identifiesControllerService(CacheServiceAPI.class) 
   .build();


 BTW, the former I mentioned in my original post was referring to the descriptions I had given
about how to instantiate the Controller Service.
Many thanksDave 


     On Sunday, 9 August 2015, 21:05, Mark Payne <markap14@hotmail.com> wrote:
   

 Hi David,

You should be able to just import your StandardCacheService in your unit test.

You can then instantiate the controller service and use TestRunner.addControllerService, as
you're doing here. 
At that point, to set the properties, you can use TestRunner.setProperty. For example:

final StandardCacheService cacheService = new StandardCacheService();
runner.addControllerService("my-cache", cacheService);
runner.setProperty(cacheService, StandardCacheService.DATAFILE, "/data/file");
runner.enableControllerService(cacheService);

There is no need to actually create the Logger and call initialize, as that is handled for
you when you call TestRunner.addControllerService.

In your message, can you explain a bit further what you meant by 
"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?"

It's important that you not mark the PropertyDescriptor as private, or else you won't be able
to access it, and you'll also want to ensure that
it is returned by your getSupportedPropertyDescriptors() method. If I am misunderstanding
the comment, please advise.

Let me know if this clears things up for you, or if you need any more details.

If anything doesn't make sense, just give a shout - we're always happy to help!  :)

Thanks
-Mark


----------------------------------------
> Date: Sun, 9 Aug 2015 14:40:53 +0000
> From: davidrsmith@btinternet.com
> To: dev@nifi.apache.org
> Subject: Instantiating a Controller Service in a Junit test
>
> 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
>
>
                         

  
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message