2015-12-14 1 views
1

У меня есть программа, которую я хочу издеваться над данными для использования Mockito.
Моя основная программа AdDataAggregate и она называет AdDataConnect.
AdDataConnect делает вызов 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

Отлично! Примите мой ответ, чтобы получить кредит. Благодаря! –

Смежные вопросы