2016-11-01 6 views
0
public void createId() { 

      Customer cust = findCustomer(this.custId); 
      Address addr = findAddress(this.addr); 

      UniqueIdCreator create = new UniqueIdCreator(this.custId, this.addr, this.name); 
      create.populate(); 
      this.name.setName(create.customerName.getName()); 
} 

для выше как я пропускаю метод create.populate();Mockito пропустить новый объект вызова

Вот что я сделал:

@Test 
public void test { 
    Customer cust = new Customer(); 
    cust.setId(1); 
    cust.setName("test"); 
    Address addr = new Address(); 
    addr.setStreet("test-st"); 
    IdCreator c = Mockito.spy(new IdCreator(cust,addr,null)); 
    getDao.getPresist.add(cust); 
    getDao.getPresist.add(addr); 
    c.createId(); 
} 

ошибка: пустой указатель внутри метода «create.populate() ;»

Это только для mockito.

+0

Возможный дубликат [Как высмеять конструктор по умолчанию с помощью PowerMock с помощью Mockito?] (Http://stackoverflow.com/questions/15501572/how-to-mock-the-default-constructor-using-powermock- с-mockito) – talex

+0

Макет-конструктор, а затем метод вызова метода. – talex

+0

Я пробовал это, но, похоже, он все еще не пропускает. Я пробовал метод mock b, затем называть b, ничего не делая. но tc.methodA все еще читает b – logger

ответ

1

На высоком уровне вы не написали код, чтобы быть достаточно гибким для того, что вы просите. Реализация createId, к лучшему или худшему, создает новый экземпляр UniqueIdCreator с таким же поведением.

Хотя вы могли бы пойти с инъекции полной зависимости здесь и пройти в UniqueIdCreatorFactory, это может быть гораздо проще просто извлечь создание в переопределение метода:

public void createId() { 
    Customer cust = findCustomer(this.custId); 
    Address addr = findAddress(this.addr); 

    UniqueIdCreator create = makeIdCreator(); 
    this.name.setName(create.customerName.getName()); 
} 

protected UniqueIdCreator makeIdCreator() { 
    UniqueIdCreator create = new UniqueIdCreator(
     this.custId, this.addr, this.name); 
    create.populate(); 
    return create; 
} 

Это дает вам всю возможность вы нужно пропустить выполнение, без необходимости PowerMock или даже Mockito:

@Test 
public void test { 
    Customer cust = new Customer(); 
    cust.setId(1); 
    cust.setName("test"); 
    Address addr = new Address(); 
    addr.setStreet("test-st"); 
    IdCreator c = Mockito.spy(new IdCreator(cust,addr,null) { 
     @Override protected UniqueIdCreator makeIdCreator() { 
     return Mockito.mock(UniqueIdCreator.class); 
     } 
    }); 
    getDao.getPresist.add(cust); 
    getDao.getPresist.add(addr); 
    c.createId(); 
} 

Но, конечно же, вы можете использовать Spy тоже:

@Test 
public void test { 
    Customer cust = new Customer(); 
    cust.setId(1); 
    cust.setName("test"); 
    Address addr = new Address(); 
    addr.setStreet("test-st"); 
    IdCreator c = Mockito.spy(new IdCreator(cust,addr,null)); 
    doReturn(Mockito.mock(UniqueIdCreator.class)).when(c).makeIdCreator(); 
    getDao.getPresist.add(cust); 
    getDao.getPresist.add(addr); 
    c.createId(); 
} 
0

Я полагаю, вы можете сделать следующее:

Добавить

@RunWith(PowerMockRunner.class) 
@PrepareForTest(IdCreator.class) 

в тестовом классе. Затем перепишите свой тест

@Test 
public void test { 
    long custId = 1; 

    IdCreator objectToTest = Mockito.spy(new IdCreator(cust,addr,null)); 

    when(objectToTest.findCustomer(custId)).thenReturn(mock(Customer.class)). 
    when(objectToTest.findAddress(custId)).thenReturn(mock(Address.class)). 

    UniqueIdCreator creatorMock = mock(UniqueIdCreator.class); 

    PowerMockito.whenNew(UniqueIdCreator.class).withAnyArguments().thenReturn(creatorMock); 

    Mockito.doNothing().when(creatorMock.populate()); 

    objectToTest.createId(); 
} 

PS: Это только черновик кода. А не проверял.

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