2016-02-18 3 views
0

Я новичок в Java мире, но это очень трудно понять, почему я не могу окурок метода издевался объект ...Mockito - Невозможно раскорчевка издевались объект

@RunWith(MockitoJUnitRunner.class) 
public class ChildBLLIT extends BaseInteractorIT { 

    @InjectMocks 
    private ChildBLL ChildBLL = Mockito.mock(ChildBLL.class); 

    @Before 
    public void setUp() { 
    ChildBLL.engine = engineMock; 
    } 

    /** 
    * Test of getZipStatistics method, of class ChildBLL. 
    */ 
    @Test 
    public void testGetZipStatistics() { 
    final String testZipStatisticsText = "DummyZipStatistics"; 
    //This method will throw the null pointer exception 
    when(ChildBLL.engine.getZIPStatistics()).thenReturn(testZipStatisticsText); 


    ChildBLL.getZipStatistics(); 
    verify(ChildBLL.engine).getZIPStatistics(); 
    } 

} 

Когда я пытаюсь незавершенным в getZIPStatistics () метод Я получаю всегда исключение нулевого указателя, конечно, я получаю, потому что в методе getZIPStatistics() есть частный объект, который не издевается ... мне кажется, что Mockito не издевается над частными полями ... и, к сожалению, это из другого проекта:

public class BaseIT { 

    @Mock 
    protected static FromOtherProject engineMock; 

    @Before 
    public void initMocks() { 
    MockitoAnnotations.initMocks(this); 
    } 
} 

Здесь я издевался переменная двигателя, но тогда как я могу издеваться/заглушить метод getZIPStatistics()? Это такой метод:

public class FromOtherProject { 
    //... 
    public final String getZIPStatistics() { 
     return ZIPStatistics.toString(); 
    } 
} 

Что я могу сделать?

ответ

1

Давайте предположим, что простой класс ...

public class Account { 

    public String getPassword() { 
     return "abc"; 
    } 
} 

... и простой класс, который содержит его ...

public class AccountHolder { 
    private Account account; 

    public String getAccountPassword() { 
     return this.account.getPassword(); 
    } 

} 

Так что теперь у нас есть простой базовый класс для всех Счетов на основе тесты ...

public class AccountBasedTest { 

    @Mock 
    protected Account account; 

} 

... и класс, который на самом деле испытывает ...

владельца счета
@RunWith(MockitoJUnitRunner.class) 
public class AccountHolderTest extends AccountBasedTest { 

    @InjectMocks 
    private AccountHolder accountHolder; 

    @Test 
    public void getAccountPasswort_must_return_account_password() { 
     Mockito.when(this.account.getPassword()).thenReturn ("xyz"); 

     Assert.assertEquals("xyz", this.accountHolder.getAccountPassword()); 
    } 

} 

И все. Аннотации @InjectMocks и т. Д. Также будут выглядеть в суперклассах, поэтому вы получите свою издеваемую учетную запись, и эта учетная запись будет помещена в ваш AccountHolder. Не нужно звонить MockitoAnnotations.initMocks. Это не должно повредить, но это не нужно, потому что вы уже используете MockitoJUnitRunner, что делает именно это.

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