2015-12-14 2 views
1

В моем классе зависимости вводятся весной. Во время тестирования я использую mocks. Я получаю исключение нулевого указателя, когда я вызываю sys.getId("abc12345") в следующем коде. Мне интересно, как написать единичный тест, который получает 100% -ный охват.Mockito насмешливые объекты изнутри локального метода

Класс испытываемого:

public class SystemUT implements SUTIface{ 

    @Inject 
    private AccountLookupDAO dao; 

    @Inject 
    private OrchService service; 

    public Response perform(Request req){ 
     String sellerId = getId(request.getSeller().getNum()); 

     String buyerId = null; 

     if(req.getBuyerId){ 
      buyerId = getId(request.getBuyer().getNum()) 
     } 

      service.execute(Request,sellerId,buyerId) 

    } 

    String getId(String num){ 
     PrefAcct prefAcctObj = dao.lookupPrefId(num,Consants.StrArr); 
     PrefSysOfRecObj sorObj= prefAcctObj.getSysOfRecord(); 
     return sorObj.getId(); 
    } 

} 

тест Unit:

public Class SystemUTTest{ 

    @Mock 
    SystemUT sys; 

    @Mock 
    AccountLookupDAO daoMock; 

    @Mock 
    OrchService serviceMock; 

    @Mock 
    PrefAcct prefAcctObj; 

    @Mock 
    PrefSysOfRecObj sorObj; 

    @Before 
    public void setup(){ 
     Whitebox.setInternalState(sys, daoMock, serviceMock); 
    } 

    @Test 
    public test getId(){ 

     when(dao.lookupPrefId(any(String.class), any(String[].class))).thenReturn(prefAcctObj); 
     when(prefAcctObj.getSysOfRecord()).thenReturn(sorObj); 
     when(sorObj.getId()).thenReturn("185"); 

     assertEquals("185",sys.getId("abc12345")); 

    } 

} 
+0

Я не уверен, что вы пытаетесь достичь в целом. ваш тест getID(), похоже, проверяет, что насмешливые работы? Вы не должны быть @Mocking вашего объекта sys, просто инициализируйте его как обычный sys = новый SystemUT() в вашей настройке. – KarlM

ответ

2

Ваша проблема в том, что ваш SystemUT класс не имеет его зависимостей вводили. У вас может есть весна сделать это, используя их JUnitRunner, но это на самом деле не единичный тест, так как вы позволите Spring диктовать, какие зависимости будут введены. На самом деле, вы хотите, чтобы контролировать их, и один из способов сделать это, чтобы превратить ваш класс, чтобы выставить его зависимости с помощью конструктора:

public class SystemUT implements SUTIface{ 

    private final AccountLookupDAO dao; 
    private final OrchService service; 

    @Inject 
    public SystemUT(AccountLookupDAO dao, OrchService service) { 
     this.dao = dao; 
     this.service = service; 
    } 
} 

Это будет работать одинаково для текущего подхода, поскольку Spring способен придать зависимости с помощью конструктор, аннотированный с помощью @Inject. Теперь, когда вы создать экземпляр класса SystemUT для испытания, проходят издевались объекты для своих зависимостей:

@Mock 
AccountLookupDAO daoMock; 

@Mock 
OrchService serviceMock; 

private SystemUT sys; 

@Before 
public void setup(){ 
    sys = new SystemUT(daoMock, serviceMock); 
    Whitebox.setInternalState(sys, daoMock, serviceMock); 
} 
+0

Я следил за вашими инструкциями, но я все еще получаю исключение с нулевым указателем в строке PrefSysOfRecObj sorObj = prefAcctObj.getSysOfRecord(); спасибо за изучение проблемы. – shyamsrd

+1

@shyamsrd - Это потому, что есть что-то в этом методе (который вы не отправляли в свой вопрос), который не настроен правильно для теста. Отправьте метод и трассировку стека, и я могу обновить свой ответ. – nickb