2016-04-21 1 views
0

У меня есть несколько сложная процедура, которую я пытаюсь проверить. getDatesMi вызывает вызов метода в том же классе. Этот метод вызывает вызов методу интерфейса, который возвращает результат запроса, который передается типу MarketLimits.Как создавать классы, которые создаются в тестовом классе с помощью EasyMock?

Я использую EasyMock и junit.

Мои вопросы:

  1. , как я могу проверить getSqlMapClientTemplate() queryForObject.?
  2. как я дразнить, что результат getSqlMapClientTemplate(). QueryForObject отливают MarketLimits

Я новичок в Java и EasyMock поэтому, возможно, ответ obviuos но любая помощь приветствуется.

В настоящее время я получаю NullPointerException на subDates.greaterThenOne()

интерфейс для MyServiceDao

import com.foo.bar.domain.MarketLimits; 

public interface MyServiceDao { 
    public MarketLimits getDates(long orgId) throws DataAccessException; 
} 

класс, который реализует MyServiceDao

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; 
import com.foo.bar.domain.MarketLimits; 


public class myServiceImpl implements MyServiceDao{ 

    @Override 
    public MarketLimits getDates(long orgId) throws DataAccessException { 
     return (MarketLimits) getSqlMapClientTemplate().queryForObject("retrieveLimits", orgId); 
    } 

}

основной класс тестируемой

import com.foo.bar.dao.MyServiceDao; 

public class myServiceImpl extends reports implements myService { 

    @Autowired 
    private MyServiceDao myServiceDao; 


    public String getDatesMi() throws Exception { 
     MarketLimits subDates = getDates(23); 

     System.out.print(subDates); // this prints out null 

     if(subDates.greaterThenOne()){ 
      // do some things 
     } 

     return "result" 
    } 


    @Override 
    public MarketLimits getDates(long orgId) { 
     return myServiceDao.getDates(orgId); 
    } 


    public setMyServiceDao(MyServiceDao myServiceDao){ 
     this.myServiceDao = myServiceDao 
    } 

} 

MyTest

@RunWith(EasyMockRunner.class) 
public class myServiceImplTest { 

    @org.easymock.Mock 
    private MyServiceDao myServiceDao; 

    @TestSubject 
    private MyServiceImpl myServiceImpl = new MyServiceImpl(); 

    @Test 
    public void testGetDatesMi() throws Exception { 

     MarketLimits limits = new MarketLimits(); 
     limits.greaterThenOne(true); 
     expect(myServiceDao.getDates()).andReturn(limits); 
     replay(myServiceDao); 

     myServiceImpl.getDatesMi(12); 

    } 
} 

ОБНОВЛЕНИЕ 1

по какой-то причине EasyMock экземпляр myServiceDao создавалась, однако, когда метод был призвал Ea Экземпляр syMock возвращает NULL. Моим решением было создать метод setter на myServiceImpl, чтобы установить мой myServiceDao mock. Это было предложение Deendayal Garg

UPDATE 2

Оказывается, мне не нужно иметь сеттер =) Я изменил название, чтобы отразить реальную проблему я обращенную.

+0

Я обновил вопрос, где происходит ошибка null – mattwilsn

ответ

1

Ok. Чтобы дать более полный ответ, я попробовал ваш код.Между классами существует много несоответствий. Я исправил их, насколько мог, и вот рабочий пример. Как вы увидите, ни один сеттер не нужен для ввода Dao.

@RunWith(EasyMockRunner.class) 
public class MyServiceImplTest { 

    @org.easymock.Mock 
    private MyServiceDao myServiceDao; 

    @TestSubject 
    private MyServiceImpl myServiceImpl = new MyServiceImpl(); 

    @Test 
    public void testGetDatesMi() throws Exception { 

     MarketLimits limits = new MarketLimits(); 
     limits.greaterThenOne(true); 
     expect(myServiceDao.getDates(23)).andReturn(limits); 
     replay(myServiceDao); 

     myServiceImpl.getDatesMi(); 

     verify(myServiceDao); 
    } 
} 

public class MarketLimits { 
    private boolean b; 

    public void greaterThenOne(boolean b) { 
     this.b = b; 
    } 

    public boolean greaterThenOne() { 
     return b; 
    } 
} 

public interface MyServiceDao { 
    MarketLimits getDates(long orgId); 
} 

public class MyServiceImpl { 

    private MyServiceDao myServiceDao; 


    public String getDatesMi() throws Exception { 
     MarketLimits subDates = getDates(23); 

     System.out.print(subDates); // this prints out null 

     if(subDates.greaterThenOne()){ 
      // do some things 
     } 

     return "result"; 
    } 

    public MarketLimits getDates(long orgId) { 
     return myServiceDao.getDates(orgId); 
    } 

    public void setMyServiceDao(MyServiceDao myServiceDao){ 
     this.myServiceDao = myServiceDao; 
    } 

} 
+0

Спасибо за предложение, но вызов проверки возвращает эту ошибку java.lang.IllegalStateException: вызов проверки не разрешен в состоянии записи в org.easymock.internal.MocksControl.verify (MocksControl. java: 223) \t at org.easymock.EasyMock.verify (EasyMock.java:2007) – mattwilsn

+0

Arg ... Извините. Это должно было быть 'replay' – Henri

+0

Спасибо, это здорово. – mattwilsn

0

Поскольку вы тестируете MyServiceImpl, вы можете полностью издеваться над myServiceDao. вам необходимо установить сеттер для myServiceDao в классе MyServiceImpl. Это Mockito spefici, но то же самое можно сделать и в EasyMock.

Внутри тестового класса вы cna делаете что-то вроде ниже.

@Test 
public void testGetDatesMi() throws Exception { 
    myServiceImpl.setMyServiceDao(myServiceDao);// this is mock 
    when(myServiceDao.getDates(anyLong()).thenReturn(mockMarketLimits); 

    // call you method here 

    // verify 
} 
+0

Это синтаксис mockito. И вам не нужно устанавливать макет. Это будет сделано автоматически бегуном – Henri

+0

Да. Я уже сказал это в ответ. –

+0

Да. Но также нет необходимости вызывать setter – Henri

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