// Path: src/main/java/acromusashi/stream/entity/StreamMessage.java
// public class StreamMessage implements Serializable
// {
//     /** serialVersionUID */
//     private static final long   serialVersionUID = -7553630425199269093L;
// 
//     /** Message Header */
//     private StreamMessageHeader header;
// 
//     /** Message Body */
//     private Object              body;
// 
//     /**
//      * Constructs instance.
//      */
//     public StreamMessage()
//     {
//         this.header = new StreamMessageHeader();
//     }
// 
//     /**
//      * Constructs instance with Header and body.
//      *
//      * @param header Message Header
//      * @param body Message Body
//      */
//     public StreamMessage(StreamMessageHeader header, Object body)
//     {
//         this.header = header;
//         this.body = body;
//     }
// 
//     /**
//      * @return the header
//      */
//     public StreamMessageHeader getHeader()
//     {
//         return this.header;
//     }
// 
//     /**
//      * @param header the header to set
//      */
//     public void setHeader(StreamMessageHeader header)
//     {
//         this.header = header;
//     }
// 
//     /**
//      * @return the body
//      */
//     public Object getBody()
//     {
//         return this.body;
//     }
// 
//     /**
//      * @param body the body to set
//      */
//     public void setBody(Object body)
//     {
//         this.body = body;
//     }
// 
//     /**
//      * Add field to message body.
//      *
//      * @param key key
//      * @param value value
//      */
//     @SuppressWarnings({"unchecked", "rawtypes"})
//     public void addField(String key, Object value)
//     {
//         if (this.body == null || Map.class.isAssignableFrom(this.body.getClass()) == false)
//         {
//             this.body = Maps.newLinkedHashMap();
//         }
// 
//         ((Map) this.body).put(key, value);
//     }
// 
//     /**
//      * Get field from message body.
//      *
//      * @param key key
//      * @return field mapped key
//      */
//     @SuppressWarnings("rawtypes")
//     public Object getField(String key)
//     {
//         if (this.body == null || Map.class.isAssignableFrom(this.body.getClass()) == false)
//         {
//             return null;
//         }
// 
//         return ((Map) this.body).get(key);
//     }
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String toString()
//     {
//         String result = this.header.toString() + "," + this.body.toString();
//         return result;
//     }
// }


import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.CoreMatchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import org.mockito.runners.MockitoJUnitRunner;
import acromusashi.stream.entity.StreamMessage;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import com.google.common.collect.Lists;
        // 検証
        ArgumentCaptor<Fields> argument = ArgumentCaptor.forClass(Fields.class);
        Mockito.verify(mockDeclarer).declare(argument.capture());

        Fields argFields = argument.getValue();
        assertThat(argFields.size(), equalTo(2));
        assertThat(argFields.get(0), equalTo("messageKey"));
        assertThat(argFields.get(1), equalTo("messageValue"));
    }

    /**
     * KeyHistoryInfo未保持Tuple受信時、新規KeyHistoryInfoを生成して動作を継続することを確認する。
     *
     * @target {@link AmBaseBolt#execute(Tuple)}
     * @test 新規KeyHistoryInfoを生成して動作を継続することを確認
     *    condition:: KeyHistoryInfo未保持Tuple受信時
     *    result:: 新規KeyHistoryInfoを生成して動作を継続することを確認
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    @Test
    public void testExecute_KeyHistoryInfo未保持Tuple処理確認()
    {
        // 準備
        Mockito.when(this.mockContext.getThisComponentId()).thenReturn("ComponentId");
        Mockito.when(this.mockContext.getThisTaskIndex()).thenReturn(0);

        AmBaseThroughBolt targetBolt = new AmBaseThroughBolt();
        targetBolt.setFields(Lists.newArrayList("Param1"));
        targetBolt.prepare(this.mockConfMap, this.mockContext, this.mockCollector);

// Path: src/main/java/acromusashi/stream/entity/StreamMessage.java
// public class StreamMessage implements Serializable
// {
//     /** serialVersionUID */
//     private static final long   serialVersionUID = -7553630425199269093L;
// 
//     /** Message Header */
//     private StreamMessageHeader header;
// 
//     /** Message Body */
//     private Object              body;
// 
//     /**
//      * Constructs instance.
//      */
//     public StreamMessage()
//     {
//         this.header = new StreamMessageHeader();
//     }
// 
//     /**
//      * Constructs instance with Header and body.
//      *
//      * @param header Message Header
//      * @param body Message Body
//      */
//     public StreamMessage(StreamMessageHeader header, Object body)
//     {
//         this.header = header;
//         this.body = body;
//     }
// 
//     /**
//      * @return the header
//      */
//     public StreamMessageHeader getHeader()
//     {
//         return this.header;
//     }
// 
//     /**
//      * @param header the header to set
//      */
//     public void setHeader(StreamMessageHeader header)
//     {
//         this.header = header;
//     }
// 
//     /**
//      * @return the body
//      */
//     public Object getBody()
//     {
//         return this.body;
//     }
// 
//     /**
//      * @param body the body to set
//      */
//     public void setBody(Object body)
//     {
//         this.body = body;
//     }
// 
//     /**
//      * Add field to message body.
//      *
//      * @param key key
//      * @param value value
//      */
//     @SuppressWarnings({"unchecked", "rawtypes"})
//     public void addField(String key, Object value)
//     {
//         if (this.body == null || Map.class.isAssignableFrom(this.body.getClass()) == false)
//         {
//             this.body = Maps.newLinkedHashMap();
//         }
// 
//         ((Map) this.body).put(key, value);
//     }
// 
//     /**
//      * Get field from message body.
//      *
//      * @param key key
//      * @return field mapped key
//      */
//     @SuppressWarnings("rawtypes")
//     public Object getField(String key)
//     {
//         if (this.body == null || Map.class.isAssignableFrom(this.body.getClass()) == false)
//         {
//             return null;
//         }
// 
//         return ((Map) this.body).get(key);
//     }
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String toString()
//     {
//         String result = this.header.toString() + "," + this.body.toString();
//         return result;
//     }
// }


// Path: src/test/java/acromusashi/stream/bolt/AmBaseBoltTest.java
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.CoreMatchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import org.mockito.runners.MockitoJUnitRunner;
import acromusashi.stream.entity.StreamMessage;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import com.google.common.collect.Lists;

        // 検証
        ArgumentCaptor<Fields> argument = ArgumentCaptor.forClass(Fields.class);
        Mockito.verify(mockDeclarer).declare(argument.capture());

        Fields argFields = argument.getValue();
        assertThat(argFields.size(), equalTo(2));
        assertThat(argFields.get(0), equalTo("messageKey"));
        assertThat(argFields.get(1), equalTo("messageValue"));
    }

    /**
     * KeyHistoryInfo未保持Tuple受信時、新規KeyHistoryInfoを生成して動作を継続することを確認する。
     *
     * @target {@link AmBaseBolt#execute(Tuple)}
     * @test 新規KeyHistoryInfoを生成して動作を継続することを確認
     *    condition:: KeyHistoryInfo未保持Tuple受信時
     *    result:: 新規KeyHistoryInfoを生成して動作を継続することを確認
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    @Test
    public void testExecute_KeyHistoryInfo未保持Tuple処理確認()
    {
        // 準備
        Mockito.when(this.mockContext.getThisComponentId()).thenReturn("ComponentId");
        Mockito.when(this.mockContext.getThisTaskIndex()).thenReturn(0);

        AmBaseThroughBolt targetBolt = new AmBaseThroughBolt();
        targetBolt.setFields(Lists.newArrayList("Param1"));
        targetBolt.prepare(this.mockConfMap, this.mockContext, this.mockCollector);

        StreamMessage message = new StreamMessage();