TradeAccountEvent
package bbejeck.guava.chapter7.events;
import bbejeck.guava.common.model.TradeAccount;
import static com.google.common.base.Preconditions.*;
import java.util.Date;
/**
* User: Bill Bejeck
* Date: 4/26/13
* Time: 10:20 AM
*/
public class TradeAccountEvent {
private double amount;
private Date tradeExecutionTime;
private TradeType tradeType;
private TradeAccount tradeAccount;
public TradeAccountEvent(TradeAccount account, double amount, Date tradeExecutionTime, TradeType tradeType) {
checkArgument(amount > 0.0, "Trade can't be less than zero");
this.amount = amount;
this.tradeExecutionTime = checkNotNull(tradeExecutionTime,"ExecutionTime can't be null");
this.tradeAccount = checkNotNull(account,"Account can't be null");
this.tradeType = checkNotNull(tradeType,"TradeType can't be null");
}
public double getAmount() {
return amount;
}
public Date getTradeExecutionTime() {
return tradeExecutionTime;
}
public TradeType getTradeType() {
return tradeType;
}
public TradeAccount getTradeAccount() {
return tradeAccount;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof TradeAccountEvent)) return false;
TradeAccountEvent that = (TradeAccountEvent) o;
if (Double.compare(that.amount, amount) != 0) return false;
if (tradeAccount != null ? !tradeAccount.equals(that.tradeAccount) : that.tradeAccount != null) return false;
if (tradeExecutionTime != null ? !tradeExecutionTime.equals(that.tradeExecutionTime) : that.tradeExecutionTime != null)
return false;
if (tradeType != that.tradeType) return false;
return true;
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(amount);
result = (int) (temp ^ (temp >>> 32));
result = 31 * result + (tradeExecutionTime != null ? tradeExecutionTime.hashCode() : 0);
result = 31 * result + (tradeType != null ? tradeType.hashCode() : 0);
result = 31 * result + (tradeAccount != null ? tradeAccount.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "TradeAccountEvent{" +
"amount=" + amount +
", tradeExecutionTime=" + tradeExecutionTime +
", tradeType=" + tradeType +
", tradeAccount=" + tradeAccount +
"} ";
}
public static class Builder {
private double amount = 1000.43;
private Date tradeExecutionTime = new Date();
private TradeType tradeType = TradeType.BUY;
private TradeAccount tradeAccount = new TradeAccount.Builder().build();
public Builder(){}
public Builder amount(double amount) {
this.amount = amount;
return this;
}
public Builder tradeExecutionTime(Date tradeExecutionTime) {
this.tradeExecutionTime = tradeExecutionTime;
return this;
}
public Builder tradeType(TradeType tradeType) {
this.tradeType = tradeType;
return this;
}
public Builder tradeAccount(TradeAccount tradeAccount) {
this.tradeAccount = tradeAccount;
return this;
}
public TradeAccountEvent build(){
return new TradeAccountEvent(this.tradeAccount,this.amount,this.tradeExecutionTime,this.tradeType);
}
}
}
SimpleTradeAuditor
package bbejeck.guava.chapter7.subscriber.simple;
import bbejeck.guava.chapter7.events.TradeAccountEvent;
import com.google.common.collect.Lists;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static com.google.common.base.Preconditions.*;
import java.util.List;
/**
* User: Bill Bejeck
* Date: 4/26/13
* Time: 10:39 AM
*/
@Component
public class SimpleTradeAuditor {
private List<TradeAccountEvent> tradeEvents = Lists.newArrayList();
@Autowired
public SimpleTradeAuditor(EventBus eventBus){
checkNotNull(eventBus,"EventBus can't be null");
eventBus.register(this);
}
@Subscribe
public void auditTrade(TradeAccountEvent tradeAccountEvent){
tradeEvents.add(tradeAccountEvent);
System.out.println("Received trade "+tradeAccountEvent);
}
public List<TradeAccountEvent> getTradeEvents() {
return tradeEvents;
}
}
测试用例
package bbejeck.guava.chapter7;
import bbejeck.guava.chapter7.events.BuyEvent;
import bbejeck.guava.chapter7.events.SellEvent;
import bbejeck.guava.chapter7.events.TradeAccountEvent;
import com.google.common.eventbus.EventBus;
/**
* User: Bill Bejeck
* Date: 4/28/13
* Time: 8:01 PM
*/
public abstract class EventBusTestBase {
protected TradeAccountEvent.Builder getTradeAccountEventBuilder(){
return new TradeAccountEvent.Builder();
}
protected BuyEvent.Builder buyEventBuilder(){
return new BuyEvent.Builder();
}
protected SellEvent.Builder sellEventBuilder(){
return new SellEvent.Builder();
}
protected EventBus getEventBus() {
return new EventBus();
}
}
package bbejeck.guava.chapter7.subscriber;
import bbejeck.guava.chapter7.EventBusTestBase;
import bbejeck.guava.chapter7.events.TradeAccountEvent;
import bbejeck.guava.chapter7.events.TradeType;
import bbejeck.guava.chapter7.subscriber.simple.SimpleTradeAuditor;
import com.google.common.eventbus.EventBus;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* User: Bill Bejeck
* Date: 4/28/13
* Time: 8:24 PM
*/
public class SimpleTradeAuditorTest extends EventBusTestBase {
private SimpleTradeAuditor auditor;
private EventBus eventBus;
private TradeAccountEvent.Builder builder;
@Before
public void setUp() {
eventBus = getEventBus();
auditor = new SimpleTradeAuditor(eventBus);
builder = getTradeAccountEventBuilder();
}
@Test
public void testSubscribeBuy() throws Exception {
TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.BUY).amount(5000.89).build();
eventBus.post(tradeAccountEvent);
List<TradeAccountEvent> events = auditor.getTradeEvents();
assertThat(events.get(0).getTradeType(), is(TradeType.BUY));
assertThat(events.get(0).getAmount(), is(5000.89));
}
@Test
public void testSubscribeSell() throws Exception {
TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.SELL).amount(5000.89).build();
eventBus.post(tradeAccountEvent);
List<TradeAccountEvent> events = auditor.getTradeEvents();
assertThat(events.get(0).getTradeType(), is(TradeType.SELL));
assertThat(events.get(0).getAmount(), is(5000.89));
}
@Test
public void testSubscribeBuySell() throws Exception {
TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.SELL).amount(5000.89).build();
eventBus.post(tradeAccountEvent);
tradeAccountEvent = builder.tradeType(TradeType.BUY).amount(80000).build();
eventBus.post(tradeAccountEvent);
List<TradeAccountEvent> events = auditor.getTradeEvents();
assertThat(events.get(0).getTradeType(), is(TradeType.SELL));
assertThat(events.get(0).getAmount(), is(5000.89));
assertThat(events.get(1).getTradeType(), is(TradeType.BUY));
assertThat(events.get(1).getAmount(), is(80000D));
}
}
版权声明:本文为gqltt原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。