2015-12-14 33 views
1

我有一个程序,我想模拟使用Mockito的数据。
我的主要计划是AdDataAggregate,它叫AdDataConnect
AdDataConnect调用一个API,该API返回一个被解析为JSON并聚合的字符串。我的模拟没有被我的程序使用

我创建了模拟并返回数据,但它们并未被主程序使用。
有人可以告诉我我的方式错误。在此先感谢您的帮助。

//Main Program 
public class AdDataAggregate {
 
public List<AdData> processInfo(long[] adIds){
   
    AdDataConnect adDataConnect = new AdDataConnect();
   
    List<AdData> adAccumData = new ArrayList<AdData>();    

    for (long adId: adIds) {  
     data = adDataConnect.connectToData(adId); <———— method to Mock. 
     } 
  } 
}
  


//Test Program 
@RunWith(MockitoJUnitRunner.class)
  
public class AdDataTest {
  
   
@InjectMocks    
    private AdDataAggregate adDataAggregate = new AdDataAggregate();
   
    @Mock 
    private AdDataConnect adDataConnect;
    
    private String oneAdId = 
      "[{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" + 
      "07\",\"num_clicks\":10,\"num_impressions\":100}," +
          
      "{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" + 
      "06\",\"num_clicks\":20,\"num_impressions\":200}," +
  
      "{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" + 
      "05\",\"num_clicks\":30,\"num_impressions\":300}]";
 

    
 @Test  
    public void testWithOneAdId(){
   
     MockitoAnnotations.initMocks(this); 
     adDataConnect = mock(AdDataConnect.class); 
     adDataAggregate = mock(AdDataAggregate.class); 
     when(adDataConnect.connectToData(eq(1L)))
.thenReturn(oneAdId);  
     String myString = adDataConnect.connectToData(1L);
    
     long[] adIds = new long[]{1L};
    
     List<AdData> outData = adDataAggregate.processInfo(adIds);
 
     Assert.assertEquals(1, outData.size());
    
     Assert.assertEquals(myString, oneAdId);
 
     Assert.assertEquals(60, outData.get(0).getNumImpressions());
    
     Assert.assertEquals(600, outData.get(0).getNumImpressions());
    
    }
   
} 

回答

1

您需要将AdDataConnect注入AdDataAggregate而不是实例化它。当你在AdDataAggregate中实例化它时,你迫使一个实现被使用。您需要允许外部人员进行设置,以便您可以在测试中设置模拟版本。

下面是你是如何做到的。通过构造函数中的AdDataConnect:

public class AdDataAggregate 
{ 
    private AdDataConnect adDataConnect; 

    public AdDataAggregate(AdDataConnect adDataConnect) 
    { 
     this.adDataConnect = adDataConnect; 
    } 

    public List<AdData> processInfo(long[] adIds) 
    { 
     List<AdData> adAccumData = new ArrayList<AdData>(); 
     for(long adId : adIds) 
     { 
      data = adDataConnect.connectToData(adId); 
     } 
    } 
} 

然后在您的测试中执行此操作。你可以在我使用新构造函数的地方看到我的评论:

@RunWith(MockitoJUnitRunner.class) 
public class AdDataTest 
{ 
    private AdDataAggregate adDataAggregate; 

    @Mock 
    private AdDataConnect adDataConnect; 

    private String oneAdId = "[{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" 
      + "07\",\"num_clicks\":10,\"num_impressions\":100}," + "{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" 
      + "06\",\"num_clicks\":20,\"num_impressions\":200}," + "{\"advertiser_id\":\"1\",\"ymd\":\"2015-12-" 
      + "05\",\"num_clicks\":30,\"num_impressions\":300}]"; 

    @Test 
    public void testWithOneAdId() 
    { 
     MockitoAnnotations.initMocks(this); 
     adDataAggregate = new AdDataAggregate(adDataConnect);//PASS THE MOCK HERE 

     when(adDataConnect.connectToData(eq(1L))).thenReturn(oneAdId); 
     String myString = adDataConnect.connectToData(1L); 
     long[] adIds = new long[] { 1L }; 
     List<AdData> outData = adDataAggregate.processInfo(adIds); 
     Assert.assertEquals(1, outData.size()); 
     Assert.assertEquals(myString, oneAdId); 
     Assert.assertEquals(60, outData.get(0).getNumImpressions()); 
     Assert.assertEquals(600, outData.get(0).getNumImpressions()); 
    } 
} 
+0

非常感谢。这工作完美。 – user2547177

+0

太棒了!请接受我的回答,以便获得信用。谢谢! –

相关问题