2015-07-08 2 views
0

Привет я пытаюсь макет дао слоя мое приложение имеют некоторый класс прокат нездоровое как это Application-> parser-> дао (интерфейс) -> реализация дао классMockito класс -mocking реализации

моя проблема, когда я я насмешливый интерфейс дао или daoimp класс, используя Mockito в моем тестовом случае они не работают просто тест собирается БД, как сделать сделать наш тест, чтобы использовать эти объекты издевались

@RunWith(MockitoJUnitRunner.class) 
    public class CsvDataLoadServiceImplTest { 

    @Mock private MeteringDataDao meteringDataDao; 

    List<Object> persistedList; 
    Object meteringData; 
    List<Object> s=new ArrayList<Object>(); 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    @Before public void setup(){ 
     Mockito.doAnswer(new Answer<List<Object>>() { 
      @Override 
      public List<Object> answer(InvocationOnMock invocation) throws Throwable { 
       Object[] args = invocation.getArguments(); 
       System.out.println("persist all"); 
       if(persistedList == null){ 

        persistedList = (List)args[0]; 

       } 
       else 
        persistedList.addAll((List)args[0]); 
       return null; 
      }}).when(meteringDataDao).persistAll(anyList()); 

     Mockito.doAnswer(new Answer<Object>() { 
      @Override 
      public Object answer(InvocationOnMock invocation) { 
       Object[] args = invocation.getArguments(); 
       if(meteringData == null) 

        meteringData = (List)args[0]; 

       return true; 
      }}).when(meteringDataDao).persist(anyObject()); 
    } 

    @After public void tearDown(){ 
     persistedList = null; 
     meteringData = null; 

    } 

    @Test 
    public void testDataAccuricy(){ 

     CsvDataLoadService csvDataLoadService =new CsvDataLoadServiceImpl(); 
     csvDataLoadService.loadRackspaceCsvData(); 
    } 
} 
+0

Если вы не можете изменить тестируемой системы, вы можете попробовать использовать [один из этих методов] (http://stackoverflow.com/a/27552765/1426891) чтобы получить ваш макет в ваш класс. –

ответ

1
CsvDataLoadService csvDataLoadService = new CsvDataLoadServiceImpl(); 

Вы Построив экземпляр службы лед, но этот экземпляр не использует DAO, в котором вы издевались. Он использует другой. Вам нужно что-то вроде

CsvDataLoadService csvDataLoadService = 
    new CsvDataLoadServiceImpl(meteringDataDao); 
0

Ваш вопрос немного плохо сформулирован, так что извините, если я по-видимому, не поняли вас.

@JBNizet ответ правильный, вы не используете насмешливый объект, но вместо того, чтобы изменять код для теста, вам просто нужно сменить тест. Это всегда хорошая практика при написании тестов.

Вы не присвоили обманутый объект службе, поэтому я предполагаю, что объект MeteringDataDao фактически создан внутри класса, который вы пытаетесь протестировать?

Если это так, вам понадобится нечто более мощное, чем Mockito (Если вы не хотите воспроизводить возможности более мощной уже существующей библиотеки). Я бы предложил PowerMockito, который я использовал в прошлом для чего-то подобного.

Хороший пример использования powermockito издеваться конструктор класса можно увидеть в нескольких ответов на SO уже, так что я просто ссылки на них, а не пытаться повторно объяснить их уже четкие ответы:

+0

«вместо того, чтобы изменять код для теста, вы должны просто изменить тест»: хотя вам следует избегать ставить _testing code_ в _production class_, это очень отличается от улучшения гибкости вашего класса, принимая ваши зависимости. Я бы не сказал, что «всегда лучшая практика» исключает рефакторинг для тестирования, особенно за счет инъекции зависимости. –

+0

Да, это правда. Я думал больше о сценариях, где вы пытаетесь написать тест, но не можете заставить его работать должным образом, чтобы вы лучше изменили код в соответствии с вашим тестом, ради причин, по которым вы написали его в исходном состоянии , Я должен был быть более ясным. – Seb

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