nifi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Payne <marka...@hotmail.com>
Subject RE: Instantiating a Controller Service in a Junit test
Date Mon, 10 Aug 2015 00:12:06 GMT
David,

Yes, you'll also need to set the controller service in your processor. Sorry, I forgot to
mention that.

So after the call to runner.enableControllerService(), and before the call to runner.run(),
you would do:

runner.setProperty(CacheTester.CACHE_SERVICE, "my-cache");

This way, the CacheTester processor knows to reference that controller service. So your method
will look like:

@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.setProperty(CacheTester.CACHE_SERVICE, "my-cache");
   runner.enableControllerService(cacheService);
   runner.run();
}

Thanks
-Mark

----------------------------------------
> Date: Sun, 9 Aug 2015 21:06:18 +0000
> From: davidrsmith@btinternet.com
> To: dev@nifi.apache.org
> Subject: Re: Instantiating a Controller Service in a Junit test
>
> 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
View raw message