That actually works. I wonder if it's a common pattern for Storm Bolt to do this? IMO, I like to inject things either from the method or constructor. Thanks a lot. On Wed, 31 Aug 2016 at 22:31 Zachary Smith wrote: > Can't you do something like this ala mockito: > > @InjectMocks private KinesisInsertBolt underTest = new KinesisInsertBolt(); > > @Mock private AmazonKinesisClient amazonKinesisClient; > > > On Wed, Aug 31, 2016 at 9:50 PM, Noppanit Charassinvichai < > noppanit.c@gmail.com> wrote: > >> I'm writing a Bolt where a bolt will send data to Kinesis. The library is >> AmazonClient. If I initialize AmazonClient outside of prepare() method I >> will get this error >> >> *16:53:32.561* [stderr]Exception in thread "main" java.lang.RuntimeException: java.io.NotSerializableException: com.amazonaws.services.kinesis.AmazonKinesisClient*16:53:32.561* [stderr] at backtype.storm.utils.Utils.javaSerialize(Utils.java:109)*16:53:32.561* [stderr] at backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:107)*16:53:32.561* [stderr] at io.conde.data.SparrowFirehoseTopology.main(SparrowFirehoseTopology.java:93)*16:53:32.561* [stderr]Caused by: java.io.NotSerializableException: com.amazonaws.services.kinesis.AmazonKinesisClient*16:53:32.561* [stderr] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)*16:53:32.561* [stderr] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)*16:53:32.562* [stderr] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)*16:53:32.562* [stderr] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)*16:53:32.562* [stderr] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)*16:53:32.562* [stderr] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)*16:53:32.562* [stderr] at backtype.storm.utils.Utils.javaSerialize(Utils.java:105) >> >> >> >> So I have to do it like this to not get the Exception >> >> @Override >> public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) { >> this.amazonKinesisClient = new AmazonKinesisClient(new CustomCredentialsProviderChain(), new ClientConfiguration()); >> this.random = new Random(); >> this.outputCollector = outputCollector; >> this.decoder = Charset.forName("UTF-8").newDecoder(); >> } >> >> But then I won't be able to inject that and unit test that properly. How >> do I overcome this? I'm using Storm 0.10 >> >> >> >